类和方法的一个装饰器

时间:2015-09-11 18:27:16

标签: python python-2.7 python-3.x python-decorators

是否可以制作一个我可以申请类和方法的装饰器?

示例:

@my_dec(1)
class MyClass(object):
    @my_dec(2)
    def my_method(self):
        # something here

assert MyClass._x == 1
assert MyCLass.my_method._x == 2

1 个答案:

答案 0 :(得分:4)

是的,有可能。基本上你需要创建一个接受值1或2的函数,然后返回稍后传递函数或类对象的实际装饰器,现在在装饰器中我们可以使用setattr来设置属性。类或函数对象。

def my_dec(x):
    # Here x is going to be the argument passed to my_dec, i.e 1 or 2 
    def decorator(func_or_cls):
        setattr(func_or_cls, '_x', x)
        return func_or_cls
    return decorator

@my_dec(1)
class MyClass(object):
    @my_dec(2)
    def my_method(self):
        pass

assert MyClass._x == 1
assert MyClass.my_method._x == 2

要了解装饰器的工作原理,请阅读以下优秀答案:How can I make a chain of function decorators in Python?