看一下以下示例
class Base(type):
def __init__(cls, name, bases, dict_):
print 'Base.__init__() with cls %s, name %s...' % (cls, name, )
type.__init__(cls, name, bases, dict_)
M = Base('M', (object,), {})
class D1(Base):
pass
class D2(M):
pass
输出
Base.__init__() with cls <class '__main__.M'>, name M...
Base.__init__() with cls <class '__main__.D2'>, name D2...
我对结果感到很困惑,
Base.__init__
调用D2
为什么,即使我们没有创建D2
的实例?Base.__init__
调用D2
后,为什么D1
没有?答案 0 :(得分:2)
Base.__init__
:
M = Base('M', (object,), {})
您正在创建Base
的实例,因此调用其__init__
方法,这并不奇怪。
创建D2
时第二次调用它,因为创建一个类会调用元类的__init__
方法(是的,类的类)Base
1}}; D2
是Base
的实例。
D1
不会调用它,因为D1
是Base
的子类型/子类,而不是Base
的实例。
注意当D1
元类class D1(object):
__metaclass__ = Base
pass
# Base.__init__() with cls <class 'D1'>, name D1...
而不是其超类时会发生什么:
{A B C}