是否可以装饰类?

时间:2015-10-15 09:34:24

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

我知道函数装饰器和类方法装饰器。

但是,是否也可以装饰类?

3 个答案:

答案 0 :(得分:3)

是的,当然。

装饰器只是一个带参数的函数。该参数可以是一个类。

#!/usr/bin/env python3

def decorate(cls):
    print(cls)
    return cls

@decorate
class Foo: pass

此代码适用于python2和python3:

$ python example.py
__main__.Foo
$ python3 example.py
<class '__main__.Foo'>

对于函数装饰器,类装饰器可以返回任意对象。您可能希望返回表现为原始类的内容。您也可以动态修改类并返回类本身。

如果你打算为装饰者设置参数,我建议你this approach,恕我直言是最自然的(有偏见的建议:D)。

答案 1 :(得分:0)

是的,你可以:

def bar(cls):
    print("decorating {}".format(cls))

@bar
class Foo(object):
    pass

将打印:

decorating <class '__main__.Foo'>

答案 2 :(得分:0)

在Python 2.6或更高版本中,是的。旧版本仅支持函数/方法装饰器。