可以装饰类吗?

Is it possible to decorate classes?

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

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

当然可以。

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

#!/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'>

至于函数装饰器,class 装饰器可以return 任意对象。您可能想要 return 一些行为与原始 class 相同的东西。您还可以即时修改 class 和 return class 本身。

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

是的,你可以:

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

@bar
class Foo(object):
    pass

将打印:

decorating <class '__main__.Foo'>

在 Python 2.6 或更新版本中,是的。旧版本仅支持 function/method 个装饰器。