可调用模式
装饰器模式
装饰器是一种强大的可调用模式,它允许在不改变函数源代码的情况下修改或增强函数。
def timer_decorator(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 耗时 {end - start} 秒")
return result
return wrapper
@timer_decorator
def slow_function():
import time
time.sleep(2)
slow_function()
可调用类模式
策略模式
class PaymentStrategy:
def pay(self, amount):
raise NotImplementedError()
class CreditCardPayment(PaymentStrategy):
def pay(self, amount):
print(f"使用信用卡支付 ${amount}")
class PayPalPayment(PaymentStrategy):
def pay(self, amount):
print(f"使用PayPal支付 ${amount}")
class PaymentProcessor:
def __init__(self, strategy):
self.strategy = strategy
def process_payment(self, amount):
self.strategy.pay(amount)
## 使用示例
credit_payment = PaymentProcessor(CreditCardPayment())
credit_payment.process_payment(100)
函数工厂模式
def create_multiplier(factor):
def multiplier(x):
return x * factor
return multiplier
double = create_multiplier(2)
triple = create_multiplier(3)
print(double(5)) ## 10
print(triple(5)) ## 15
可调用工作流程
graph TD
A[输入] --> B{可调用对象}
B -->|函数| C[执行函数]
B -->|类方法| D[调用 __call__ 方法]
B -->|装饰器| E[修改函数行为]
常见可调用模式
模式 |
描述 |
使用场景 |
装饰器 |
修改函数行为 |
日志记录、计时、认证 |
策略 |
定义一系列算法 |
支付处理、排序 |
工厂 |
动态创建可调用对象 |
配置、插件系统 |
上下文管理器模式
class FileHandler:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __call__(self):
self.file = open(self.filename, self.mode)
return self.file
def __enter__(self):
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
if self.file:
self.file.close()
## 使用示例
with FileHandler('example.txt', 'w')() as f:
f.write('Hello, LabEx!')
高级回调机制
class EventManager:
def __init__(self):
self.callbacks = {}
def register(self, event_type, callback):
if event_type not in self.callbacks:
self.callbacks[event_type] = []
self.callbacks[event_type].append(callback)
def trigger(self, event_type, *args, **kwargs):
if event_type in self.callbacks:
for callback in self.callbacks[event_type]:
callback(*args, **kwargs)
## 示例用法
def log_event(message):
print(f"事件已记录: {message}")
def alert_event(message):
print(f"警报: {message}")
event_manager = EventManager()
event_manager.register('error', log_event)
event_manager.register('error', alert_event)
event_manager.trigger('error', '系统故障')
要点总结
- 装饰器修改函数行为
- 可调用类实现复杂的对象交互
- 函数工厂创建动态可调用对象
- 上下文管理器提供高级资源管理
- 事件系统利用可调用模式实现灵活通信