一、封装(Encapsulation)
1. 私有化实现
class BankAccount:def __init__(self, account_holder, balance=0):self.__holder = account_holder # 双下划线私有属性self.__balance = balance# 公有方法访问私有属性def deposit(self, amount):if amount > 0:self.__balance += amountprint(f"存款成功,当前余额:{self.__balance}")def get_balance(self):return self.__balance# 使用示例
account = BankAccount("Alice", 1000)
account.deposit(500) # 正常操作
print(account.__balance) # 报错:AttributeError
2. 属性装饰器
class Temperature:def __init__(self, celsius):self._celsius = celsius # 保护属性@propertydef celsius(self):return self._celsius@celsius.setterdef celsius(self, value):if value < -273.15:raise ValueError("温度不能低于绝对零度")self._celsius = value@propertydef fahrenheit(self):return self._celsius * 9/5 + 32# 使用示例
temp = Temperature(25)
print(temp.fahrenheit) # 77.0
temp.celsius = 30 # 正常设置
temp.celsius = -300 # ValueError
二、继承(Inheritance)
1. 单继承示例
class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("子类必须实现此方法")class Dog(Animal):def speak(self):return "汪汪!"def fetch(self, item):print(f"{self.name} 捡回了 {item}")class Cat(Animal):def speak(self):return "喵~"# 使用示例
dog = Dog("Buddy")
print(dog.speak()) # 汪汪!
dog.fetch("球") # Buddy 捡回了 球cat = Cat("Kitty")
print(cat.speak()) # 喵~
2. 多继承与MRO
class Camera:def take_photo(self):print("拍照中...")class Phone:def make_call(self, number):print(f"正在拨打:{number}")class SmartPhone(Camera, Phone):def run_app(self, app_name):print(f"运行 {app_name}")# 查看方法解析顺序
print(SmartPhone.mro())
# [<class '__main__.SmartPhone'>,
# <class '__main__.Camera'>,
# <class '__main__.Phone'>,
# <class 'object'>]# 使用示例
phone = SmartPhone()
phone.take_photo() # 拍照中...
phone.make_call(110) # 正在拨打:110
三、多态(Polymorphism)
1. 方法重写实现多态
class Shape:def area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.height# 多态调用
shapes = [Circle(5), Rectangle(4, 6)]
for shape in shapes:print(f"图形面积:{shape.area()}")
2. 鸭子类型实现多态
class PDFGenerator:def generate(self, data):print("生成PDF文档:", data)class HTMLGenerator:def generate(self, data):print("生成HTML页面:", data)def export_data(exporter, data):exporter.generate(data)# 调用示例
export_data(PDFGenerator(), "报表数据") # 生成PDF文档
export_data(HTMLGenerator(), "产品目录") # 生成HTML页面
四、综合实战案例
员工管理系统
class Employee:def __init__(self, name, emp_id):self.__name = nameself.__emp_id = emp_id@propertydef name(self):return self.__namedef calculate_salary(self):raise NotImplementedErrorclass FullTimeEmployee(Employee):def __init__(self, name, emp_id, monthly_salary):super().__init__(name, emp_id)self.__monthly_salary = monthly_salarydef calculate_salary(self):return self.__monthly_salaryclass PartTimeEmployee(Employee):def __init__(self, name, emp_id, hourly_rate, hours):super().__init__(name, emp_id)self.hourly_rate = hourly_rateself.hours = hoursdef calculate_salary(self):return self.hourly_rate * self.hours# 使用示例
employees = [FullTimeEmployee("张三", "FT001", 15000),PartTimeEmployee("李四", "PT001", 100, 80)
]for emp in employees:print(f"{emp.name} 薪资:{emp.calculate_salary()}")
五、最佳实践与注意事项
-
封装原则:
- 使用最少公开原则(最小化公有接口)
- 优先使用属性装饰器而不是直接暴露属性
-
继承规范:
- 避免超过三层的继承链
- 慎用多继承,优先使用组合
- 使用 super() 正确调用父类方法
-
多态实现:
- 遵循里氏替换原则(子类可替换父类)
- 使用抽象基类(ABC)强制接口实现
from abc import ABC, abstractmethodclass DatabaseConnector(ABC):@abstractmethoddef connect(self):pass
- 常见错误:
# 错误:忘记调用super().__init__
class SubClass(Parent):def __init__(self, param):self.param = param # 父类初始化未执行
通过本教程的实践,您已经掌握面向对象编程的核心特性。建议进一步学习:
- 魔术方法(如 str, add)
- 元类编程(metaclass)
- 设计模式(工厂模式、观察者模式等)