类方法和静态方法的python decorator?

时间:2017-07-13 01:51:10

标签: python decorator

我正在尝试为实例方法编写装饰器,如下所示:

from functools import wraps

def plus_decorator(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        return 1 + f(*args, **kwargs)
    return wrapper

@plus_decorator
def return_i(i):
    return i

class A(object):
    @plus_decorator
    def return_i(self, i):
        return i

    @plus_decorator
    @classmethod
    def return_i_class(cls, i):
        return i

    @plus_decorator
    @staticmethod
    def return_i_static(i):
        return i

if __name__ == '__main__':
    print return_i(1)
    a = A()
    print a.return_i(1)
    print A.return_i_class(1)
    print A.return_i_static(1)

然而,它会弹出错误:

AttributeError: 'classmethod' object has no attribute '__module__'

我想知道为什么装饰器不适用于classmethodstaticmethod。我认为装饰器大多只是将它接收的所有参数传递给包装器,并且只修改结果。如何修改装饰器以使其适用于classmethodstaticmethod

2 个答案:

答案 0 :(得分:2)

只需翻转订单。将@classmethod@staticmethod置于外部,将装饰器(使用@wraps,因此需要一个裸功能)放在内部。

@classmethod
@plus_decorator
def return_i_class(cls, i):
    return i

答案 1 :(得分:1)

尝试倒车。

当@staticmethod和@classmethod成为最顶层装饰者时,它将起作用here

因为装饰器需要一个函数,但其​​他装饰器都返回描述符对象。