核心概念与类定义
面向对象编程(OOP)是一种基于对象概念的编程范式,Python通过class
关键字实现OOP范式。每个类本质上是创建实例的蓝图,包含:
– 属性:描述对象状态的变量
– 方法:定义对象行为的函数
class Vehicle:
"""交通工具基类"""
def __init__(self, make, model):
self.make = make # 实例属性
self.model = model
self._odometer = 0 # 保护属性
def update_odometer(self, mileage):
"""方法封装数据验证"""
if mileage >= self._odometer:
self._odometer = mileage
else:
raise ValueError("里程数不能减少")
继承与多态实现
继承机制
Python通过方法解析顺序(MRO)实现多重继承,使用super()
函数调用父类方法:
class ElectricVehicle(Vehicle):
"""电动汽车派生类"""
def __init__(self, make, model, battery_size):
super().__init__(make, model)
self.battery_size = battery_size
self.__charge_level = 0 # 私有属性
@property
def charge_level(self):
"""通过@property实现属性访问控制"""
return f"{self.__charge_level}%"
多态实践
通过方法重写实现运行时多态:
class HybridVehicle(ElectricVehicle):
def update_odometer(self, mileage):
"""重写父类方法"""
super().update_odometer(mileage)
print("混合动力系统已记录新里程")
高级特性与应用
魔术方法
通过实现特殊方法定制类行为:
class Fleet:
"""车队集合类"""
def __init__(self):
self.vehicles = []
def __len__(self):
return len(self.vehicles)
def __getitem__(self, index):
return self.vehicles[index]
def add_vehicle(self, vehicle):
if isinstance(vehicle, Vehicle):
self.vehicles.append(vehicle)
类工厂模式
使用@classmethod
实现替代构造器:
class Vehicle:
@classmethod
def from_json(cls, json_data):
"""JSON数据构造器"""
return cls(json_data['make'], json_data['model'])
设计模式实践
观察者模式实现
演示事件驱动设计:
class VehicleEvent:
"""事件基类"""
pass
class MileageUpdatedEvent(VehicleEvent):
def __init__(self, new_mileage):
self.mileage = new_mileage
class VehicleObservable:
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def notify(self, event):
for observer in self._observers:
observer.update(event)
性能优化策略
__slots__
内存优化
减少实例内存占用:
class OptimizedVehicle:
__slots__ = ['make', 'model', '_odometer']
def __init__(self, make, model):
self.make = make
self.model = model
self._odometer = 0
描述符协议
实现精细化属性控制:
class PositiveNumber:
"""描述符类"""
def __set_name__(self, owner, name):
self.name = name
def __set__(self, instance, value):
if value < 0:
raise ValueError("必须为正数")
instance.__dict__[self.name] = value
class Vehicle:
mileage = PositiveNumber()
行业最佳实践
- 组合优于继承:现代Python项目更倾向使用组合
- 类型提示:Python 3.6+推荐使用类型注解
- ABC模块:使用
abc.ABC
定义抽象基类 - 数据类:Python 3.7+的
@dataclass
简化纯数据类
from dataclasses import dataclass
from typing import List
@dataclass
class ModernVehicle:
make: str
model: str
features: List[str]
mileage: int = 0 # 默认值
调试与测试建议
单元测试示例
使用unittest
模块:
import unittest
class TestVehicle(unittest.TestCase):
def setUp(self):
self.vehicle = Vehicle("Tesla", "Model S")
def test_initial_mileage(self):
self.assertEqual(self.vehicle._odometer, 0)
def test_mileage_update(self):
self.vehicle.update_odometer(100)
self.assertEqual(self.vehicle._odometer, 100)
调试技巧
- 使用
vars(obj)
检查实例属性 dir(obj)
查看可用方法和属性- 重写
__repr__
获得调试友好表示