Python元类与类装饰器

gpi*_*ino 38 python metaclass decorator

Python元类和类装饰器之间的主要区别是什么?有什么我可以用一个而不是另一个吗?

Ale*_*lli 41

装饰器更加简单,更加有限 - 因此,只要使用元类或类装饰器可以实现所需的效果,装饰器就更受欢迎.

任何你可以用一个类装饰做,当然你也可以做一个自定义的元类(只适用"装饰功能"的功能,即,一个采用一个类的对象,并修改它,在元类的的过程中__new____init__使类对象! - ).

您可以在自定义元类中执行许多操作,但不能在装饰器中执行(除非装饰器内部生成并应用自定义元类,当然 - 但这是作弊; - )......即便如此,在Python 3中,是你只能用自定义元类做的事情,而不是事后......但这是你问题的一个非常高级的子市场,所以让我举一些简单的例子).

例如,假设你想使一个类的对象X,使得print X(或在Python 3 print(X)当然;-)显示peekaboo!.没有自定义元类,你不可能做到这一点,因为元类的重写__str__是这里的关键角色,即你需要def __str__(cls): return "peekaboo!"在类的自定义元类中X.

这同样适用于所有魔术方法,即应用于类对象本身的各种操作(相对于应用于其实例的操作,使用类中定义的魔术方法 - 对类对象本身的操作)使用元类中定义的魔术方法.

  • @antitoxic,rboy做了什么影响`print(X())`,类'X`的*实例*的打印,*不*我在答案中明确提到的,'print(X)`,打印*班级本身*.重新阅读我的答案的最后一段. (11认同)
  • 嗯..这已经4年了,我在谷歌发现了这个问题.我只是想记下你的例子.我已经定义了一个装饰器`foo(cls)`,它有两个语句:`cls .__ str__ = lambda self:"peekaboo!"`并且在那之后`return cls`,它实际上有效 - 我已经设置了`某个类的__str__`方法与装饰器而不是复杂的元类.我只想注意这一点,也许可以得到一些评论,知道我是否遗漏了什么. (7认同)