Ale*_*lli 41
装饰器更加简单,更加有限 - 因此,只要使用元类或类装饰器可以实现所需的效果,装饰器就更受欢迎.
任何你可以用一个类装饰做,当然你也可以做一个自定义的元类(只适用"装饰功能"的功能,即,一个采用一个类的对象,并修改它,在元类的的过程中__new__
或__init__
使类对象! - ).
您可以在自定义元类中执行许多操作,但不能在装饰器中执行(除非装饰器内部生成并应用自定义元类,当然 - 但这是作弊; - )......即便如此,在Python 3中,是你只能用自定义元类做的事情,而不是事后......但这是你问题的一个非常高级的子市场,所以让我举一些简单的例子).
例如,假设你想使一个类的对象X
,使得print X
(或在Python 3 print(X)
当然;-)显示peekaboo!
.没有自定义元类,你不可能做到这一点,因为元类的重写__str__
是这里的关键角色,即你需要def __str__(cls): return "peekaboo!"
在类的自定义元类中X
.
这同样适用于所有魔术方法,即应用于类对象本身的各种操作(相对于应用于其实例的操作,使用类中定义的魔术方法 - 对类对象本身的操作)使用元类中定义的魔术方法.