You need to enable JavaScript to run this app. Python2如何实现绑定指定类方法前置触发的pre_execution装饰器
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 17:36:13