直接回答你的问题是:当你想要做 不仅仅是定制实例创建,或当你想分开全班 从它是如何创建的。
请参阅我在Python中创建单例的答案以及相关的讨论。
有几个优点。
它使您可以将类的 工作 与如何创建的细节分开。元类和类分别负责一件事。
您可以在元类中编写一次代码,并将其用于自定义几个类的调用行为,而不必担心多重继承。
子类可以在其__new__
方法中覆盖行为,但__call__
在元类上甚至根本不需要调用__new__
。
如果有设置工作,则可以__new__
在元类的方法中进行,并且仅发生一次,而不是每次调用该类时都进行。
当然,在很多情况下,__new__
如果您不担心单一职责原则,那么定制也可以工作。
但是,还有其他一些用例必须在更早的时候发生,即创建类时,而不是创建实例时。当这些方法发挥作用时,就必须要有一个元类。请参阅Python中元类的(具体)用例?有很多很棒的例子。