我正在尝试为实例方法编写装饰器,如下所示:
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__'
我想知道为什么装饰器对 classmethod
和 staticmethod
不起作用。我认为装饰器主要只是将它接收到的所有参数传递给包装器,并且只修改结果。如何修 retrofit 饰器以使其适用于 classmethod
和 staticmethod
?
最佳答案
只需翻转顺序。将 @classmethod
或 @staticmethod
放在外面,而你的装饰器(使用 @wraps
,因此需要一个裸函数)放在里面。
@classmethod
@plus_decorator
def return_i_class(cls, i):
return i
关于类方法和静态方法的python装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45070196/