python 2 中的装饰器装饰给定 class 的给定方法

decorator in python 2 that decorate given method of given class

我已经用方法 m 任意地 class A 我想创建可以添加到新函数 f 的装饰器,这个装饰器将允许每次调用 m 时执行 f 但在 mf 之前执行 f 应该拦截 m[=26= 的参数]

我需要帮助来定义 pre_execution 装饰器 - 我有一些东西,但它不工作,我不知道如何让它工作

#a.py
class A:
    def m(self, x):
        return x+1

#mydecorator.py     -- need help with code in this file
def pre_execution(klass, method):
    old_fn = getattr(klass, method)

    def inner(fn, *args):
        # @wraps(fn)
        def iin(*args, **kwargs):
            fn(*args, **kwargs)
            return old_fn(*args, **kwargs)
        return iin
    setattr(klass, method, inner)
    return inner


# 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
    print a.m(1)

预期输出:

in
my code using args and kwargs
out
True

我想你想要的是

def pre_execution(klass, method):
    old_method = getattr(klass, method)

    def patch_klass(f):
        def new_method(*args, **kwargs):
            f(*args, **kwargs)
            return old_method(*args, **kwargs)
        setattr(klass, method, new_method)
        return f
    return patch_klass

pre_execution 保存对原始方法的引用,然后定义将在 f 上返回和调用的函数。这个函数定义了一个 new 方法,在调用原始方法之前调用 fpatch_klass 然后用新方法替换旧方法。它还 returns 未修改原始函数,以防您想在其他地方使用 f

$ python tmp.py
in
my code using args and kwargs
out
True
in
my code using args and kwargs
out
2

请注意,这适用于 Python 2 或 3。