类方法和静态方法的python装饰器?

标签 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 不起作用。我认为装饰器主要只是将它接收到的所有参数传递给包装器,并且只修改结果。如何修 retrofit 饰器以使其适用于 classmethodstaticmethod

最佳答案

只需翻转顺序。将 @classmethod@staticmethod 放在外面,而你的装饰器(使用 @wraps,因此需要一个裸函数)放在里面。

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

关于类方法和静态方法的python装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45070196/

相关文章:

python - Python 元类有什么用?

python - 防止在每个请求上创建昂贵的对象

python - 如何将一个索引与同一列表中的前一个索引进行比较?

python - 在 Python 中将输入函数参数放入字典的最佳方法是什么?

python - 简单的获取确实很慢

python - 是否有一种 pythonic 方法可以跳过子类方法的装饰?

Javascript 装饰器,检测上下文

Python 装饰器接受任意数量的函数作为参数并返回函数的组合

python - 我怎样才能重写这个 fixture 调用,这样它就不会被直接调用?

python - 使用 Heroku 的 Django 部署 - [Errno 2] 没有这样的文件或目录