实现思路
- 定义一个类装饰器函数,该函数接受一个类作为参数。
- 在装饰器函数内部,遍历类的属性,找到所有以
process_
开头的方法。
- 使用
functools.wraps
来保留原方法的元信息(如函数名、文档字符串等),为这些方法创建新的包装函数,在包装函数中添加事务处理逻辑(打印'开始事务'和'结束事务')。
- 将原方法替换为包装后的方法。
- 返回修改后的类。
代码示例
import functools
def transaction_decorator(cls):
for name, method in cls.__dict__.items():
if callable(method) and name.startswith('process_'):
@functools.wraps(method)
def wrapper(*args, **kwargs):
print('开始事务')
result = method(*args, **kwargs)
print('结束事务')
return result
setattr(cls, name, wrapper)
return cls
class BaseClass:
def process_data(self):
print('处理数据')
@transaction_decorator
class SubClass(BaseClass):
pass
sub = SubClass()
sub.process_data()