面向对象编程是一种重要的编程思想。Python从设计开始就支持面向对象编程,这让Python在处理复杂程序时更加得心应手。
面向对象编程把程序中的各种元素看作对象。每个对象都有自己的属性和行为。这种编程方式让代码更容易组织和维护。
主要概念:
类:对象的模板,定义了对象的属性和方法
对象:类的具体实例
属性:对象具有的特征
方法:对象能够执行的操作
继承:子类可以继承父类的特性
封装:把数据和操作数据的方法包装在一起
在Python中,使用class关键字来定义类。
class Student:
"""一个学生类"""
# 类属性,所有学生对象共享
school = "阳光小学"
def __init__(self, name, age):
# 实例属性,每个学生对象独有的
self.name = name
self.age = age
def introduce(self):
"""自我介绍方法"""
print(f"我叫{self.name},今年{self.age}岁,在{self.school}上学")
# 创建学生对象
student1 = Student("小明", 12)
student2 = Student("小红", 11)
# 使用对象的方法
student1.introduce() # 输出:我叫小明,今年12岁,在阳光小学上学
student2.introduce() # 输出:我叫小红,今年11岁,在阳光小学上学在类的方法中,第一个参数通常是self,它代表对象本身。
class Person:
def __init__(self, name, age):
self.name = name # 设置实例属性
self.age = age
def say_hello(self):
print(f"你好,我是{self.name}")
# 创建对象时,不需要传递self参数
person = Person("李华", 20)
person.say_hello() # 输出:你好,我是李华self是Python的约定,你也可以用其他名字,但为了代码清晰,建议始终使用self。
__init__是一个特殊方法,在创建对象时自动调用。
class Book:
def __init__(self, title, author, price):
self.title = title
self.author = author
self.price = price
self.is_borrowed = False # 默认值
def borrow(self):
"""借书方法"""
if self.is_borrowed:
print(f"《{self.title}》已经被借走了")
else:
self.is_borrowed = True
print(f"成功借阅《{self.title}》")
def return_book(self):
"""还书方法"""
self.is_borrowed = False
print(f"已归还《{self.title}》")
# 使用类
book1 = Book("Python编程", "张老师", 45.0)
book1.borrow() # 输出:成功借阅《Python编程》
book1.borrow() # 输出:《Python编程》已经被借走了
book1.return_book() # 输出:已归还《Python编程》继承让子类可以获得父类的属性和方法。
class Animal:
"""动物基类"""
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name}在吃东西")
def sleep(self):
print(f"{self.name}在睡觉")
class Dog(Animal):
"""狗类,继承自动物类"""
def __init__(self, name, age, breed):
super().__init__(name, age) # 调用父类的构造方法
self.breed = breed # 狗特有的属性
def bark(self):
"""狗特有的方法"""
print(f"{self.name}在汪汪叫")
# 重写父类方法
def eat(self):
print(f"{self.name}在吃狗粮")
# 使用继承
my_dog = Dog("旺财", 3, "金毛")
my_dog.eat() # 输出:旺财在吃狗粮(重写后的方法)
my_dog.sleep() # 输出:旺财在睡觉(继承的方法)
my_dog.bark() # 输出:旺财在汪汪叫(子类特有方法)一个类可以继承多个父类。
class Camera:
"""相机类"""
def take_photo(self):
print("拍照")
class Phone:
"""手机类"""
def make_call(self, number):
print(f"拨打电话:{number}")
class SmartPhone(Camera, Phone):
"""智能手机类,继承相机和手机的功能"""
def __init__(self, brand):
self.brand = brand
def use_app(self, app_name):
print(f"使用{app_name}应用")
# 使用多继承
my_phone = SmartPhone("华为")
my_phone.make_call("13800138000") # 输出:拨打电话:13800138000
my_phone.take_photo() # 输出:拍照
my_phone.use_app("微信") # 输出:使用微信应用Python使用命名约定来控制属性和方法的访问权限。
class BankAccount:
"""银行账户类"""
def __init__(self, account_holder, initial_balance):
self.account_holder = account_holder # 公开属性
self._account_id = "123456" # 受保护属性(单下划线)
self.__balance = initial_balance # 私有属性(双下划线)
# 公开方法
def deposit(self, amount):
"""存款"""
if amount > 0:
self.__balance += amount
print(f"存款成功,当前余额:{self.__balance}")
else:
print("存款金额必须大于0")
def withdraw(self, amount):
"""取款"""
if 0 < amount <= self.__balance:
self.__balance -= amount
print(f"取款成功,当前余额:{self.__balance}")
else:
print("取款金额无效")
def get_balance(self):
"""获取余额(通过公开方法访问私有属性)"""
return self.__balance
# 使用银行账户
account = BankAccount("张三", 1000)
account.deposit(500) # 输出:存款成功,当前余额:1500
account.withdraw(200) # 输出:取款成功,当前余额:1300
print(account.account_holder) # 可以访问:张三
print(account.get_balance()) # 通过方法访问:1300
# 这些访问会出问题
# print(account.__balance) # 错误!无法直接访问私有属性class User:
"""用户基类"""
def __init__(self, username, email):
self.username = username
self.email = email
self.__password = None
def set_password(self, password):
"""设置密码"""
if len(password) >= 6:
self.__password = password
print("密码设置成功")
else:
print("密码长度至少6位")
def check_password(self, password):
"""验证密码"""
return self.__password == password
class Customer(User):
"""顾客类"""
def __init__(self, username, email):
super().__init__(username, email)
self.cart = [] # 购物车
self.orders = [] # 订单历史
def add_to_cart(self, product):
"""添加商品到购物车"""
self.cart.append(product)
print(f"已添加{product}到购物车")
def view_cart(self):
"""查看购物车"""
if self.cart:
print("购物车内容:")
for item in self.cart:
print(f" - {item}")
else:
print("购物车为空")
class Admin(User):
"""管理员类"""
def __init__(self, username, email, admin_level):
super().__init__(username, email)
self.admin_level = admin_level
def manage_products(self):
"""管理商品"""
print("正在管理商品...")
def view_statistics(self):
"""查看统计信息"""
print("正在查看统计信息...")
# 使用示例
customer = Customer("shopper1", "shopper@fly63.com")
customer.set_password("123456")
customer.add_to_cart("Python编程书籍")
customer.add_to_cart("鼠标")
customer.view_cart()
admin = Admin("admin1", "admin@fly63.com", "超级管理员")
admin.manage_products()import math
class Shape:
"""图形基类"""
def area(self):
"""计算面积"""
pass
def perimeter(self):
"""计算周长"""
pass
class Rectangle(Shape):
"""矩形类"""
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
class Circle(Shape):
"""圆形类"""
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
def perimeter(self):
return 2 * math.pi * self.radius
class Triangle(Shape):
"""三角形类"""
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def area(self):
# 使用海伦公式计算面积
s = (self.a + self.b + self.c) / 2
return math.sqrt(s * (s - self.a) * (s - self.b) * (s - self.c))
def perimeter(self):
return self.a + self.b + self.c
# 使用图形类
shapes = [
Rectangle(5, 3),
Circle(4),
Triangle(3, 4, 5)
]
for shape in shapes:
print(f"图形面积: {shape.area():.2f}")
print(f"图形周长: {shape.perimeter():.2f}")
print("-" * 20)Python类中有一些特殊方法,以双下划线开头和结尾。
class Vector:
"""向量类"""
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
"""定义打印对象时的显示"""
return f"向量({self.x}, {self.y})"
def __add__(self, other):
"""定义加法运算"""
return Vector(self.x + other.x, self.y + other.y)
def __mul__(self, scalar):
"""定义乘法运算"""
return Vector(self.x * scalar, self.y * scalar)
def __len__(self):
"""定义长度(向量的模)"""
return int((self.x**2 + self.y**2)**0.5)
# 使用特殊方法
v1 = Vector(2, 3)
v2 = Vector(1, 4)
print(v1) # 输出:向量(2, 3)
print(v1 + v2) # 输出:向量(3, 7)
print(v1 * 3) # 输出:向量(6, 9)
print(len(v1)) # 输出:3代码复用:通过继承可以重用已有的代码
易于维护:相关功能组织在一起,修改方便
扩展性好:可以通过继承添加新功能
模拟现实:用对象模拟现实世界的事物更直观
类名使用驼峰命名法:MyClass而不是my_class
一个类负责一个主要功能:保持类的单一职责
合理使用继承:不要过度使用继承
优先使用组合:对象包含其他对象,而不是过度继承
提供清晰的文档:为类和方法添加文档字符串
class Car:
"""汽车类"""
def __init__(self, brand, model):
self.brand = brand
self.model = model
self.engine = Engine() # 组合:汽车包含发动机
self.wheels = [Wheel() for _ in range(4)] # 组合:汽车包含轮子
class Engine:
"""发动机类"""
pass
class Wheel:
"""轮子类"""
pass掌握面向对象编程,能够让你写出更加结构清晰、易于维护的Python代码。从简单的类开始练习,逐步构建更复杂的对象关系。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!