高级扩展模式
元类编程
元类提供了一种强大的方式来自定义类的创建:
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class DatabaseConnection(metaclass=SingletonMeta):
def __init__(self):
self.connection = None
def connect(self):
if not self.connection:
self.connection = "Active Connection"
return self.connection
基于装饰器的类扩展
def validate_parameters(func):
def wrapper(self, *args, **kwargs):
if not all(args):
raise ValueError("Invalid parameters")
return func(self, *args, **kwargs)
return wrapper
class DataProcessor:
@validate_parameters
def process_data(self, data):
return f"Processed: {data}"
类组合模式
classDiagram
class BaseStrategy {
+execute()
}
class ConcreteStrategyA {
+execute()
}
class ConcreteStrategyB {
+execute()
}
class Context {
-strategy: BaseStrategy
+set_strategy()
+execute()
}
BaseStrategy <|-- ConcreteStrategyA
BaseStrategy <|-- ConcreteStrategyB
Context o-- BaseStrategy
动态类创建
def create_model_class(table_name, fields):
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
attrs = {
'__init__': __init__,
'table_name': table_name
}
return type(table_name, (), attrs)
## 动态类生成
UserModel = create_model_class('users', ['id', 'name', 'email'])
user = UserModel(id=1, name='John', email='[email protected]')
扩展策略比较
模式 |
用例 |
复杂度 |
灵活性 |
继承 |
基本扩展 |
低 |
中等 |
组合 |
灵活行为 |
中等 |
高 |
元类 |
高级定制 |
高 |
非常高 |
装饰器 |
行为修改 |
低 |
中等 |
高级混入类技术
class CacheMixin:
_cache = {}
def cache_result(self, key):
def decorator(func):
def wrapper(*args, **kwargs):
if key not in self._cache:
self._cache[key] = func(*args, **kwargs)
return self._cache[key]
return wrapper
return decorator
class DataService(CacheMixin):
@CacheMixin.cache_result('user_data')
def get_user_data(self, user_id):
## 模拟数据检索
return f"Data for user {user_id}"
代理模式实现
class ServiceProxy:
def __init__(self, service):
self._service = service
self._cache = {}
def __getattr__(self, name):
def cached_method(*args):
cache_key = (name, args)
if cache_key not in self._cache:
method = getattr(self._service, name)
self._cache[cache_key] = method(*args)
return self._cache[cache_key]
return cached_method
class RemoteService:
def expensive_operation(self, param):
## 模拟昂贵的计算
return f"Result for {param}"
## 在 LabEx Python 环境中的使用
service = ServiceProxy(RemoteService())
高级扩展的最佳实践
- 优先使用组合而非深层继承
- 利用装饰器处理横切关注点
- 谨慎使用元类
- 保持扩展模块化且专注
- 考虑性能影响
潜在陷阱
- 过度复杂化类设计
- 动态技术带来的性能开销
- 降低代码可读性
- 增加类交互的复杂性