Python2如何实现绑定指定类方法前置触发的pre_execution装饰器
修正方案
错误原因
- 原装饰器层级结构错误:
pre_execution接收类、方法名参数后,返回的内层函数仅需要接收被装饰的自定义函数f,不需要多余参数 - 原代码未将最终的方法包装函数绑定到目标类的对应方法上,导致调用逻辑完全错位
- 缺少原方法元信息保留逻辑,可能出现方法名、文档字符串丢失等问题
修正后代码
mydecorator.py(核心修改)
# mydecorator.py from functools import wraps def pre_execution(klass, method): # 先保存原类方法 old_fn = getattr(klass, method) # 内层函数接收被装饰的自定义函数f def inner(fn): @wraps(old_fn) def wrapper(*args, **kwargs): # 先执行自定义函数,透传所有入参 fn(*args, **kwargs) # 再执行原类方法,返回原方法的执行结果 return old_fn(*args, **kwargs) # 将包装好的函数替换目标类的原方法 setattr(klass, method, wrapper) # 返回原自定义函数,不影响f本身的使用 return fn return inner
其他文件适配
如果运行环境为Python3,需要将main.py中的所有print语句补充括号,修改后代码如下:
# main.py from a import A from mydecorator import pre_execution if __name__ == "__main__": @pre_execution(A, 'm') def f(*args, **kwargs): print("in") print("my code using args and kwargs") print("out") a = A() print(a.m(1) == 2)
运行结果
修改后执行main.py,输出和预期完全一致:
in my code using args and kwargs out True
内容的提问来源于stack exchange,提问作者quester
相关产品推荐
相关产品推荐

