[英]A confusion on type.__init__ in Python 2
看下面的例子
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...
我對結果感到困惑,
D2
的實例,也要為D2
調用Base.__init__
? D2
調用了Base.__init__
,為什么D1
不能呢? 首次執行時會調用Base.__init__
:
M = Base('M', (object,), {})
您正在創建Base
的實例,因此調用了它的__init__
方法,這不足為奇。
在創建D2
時第二次調用該方法,因為創建類將調用作為Base
的元類 (是,該類的類)的__init__
方法。 D2
是Base
一個實例。
因為D1
是Base
的子類型/子類,而不是它的實例,所以不為D1
調用它。
注意當您將Base
設為D1
的元類而不是其超類時會發生什么:
class D1(object):
__metaclass__ = Base
pass
# Base.__init__() with cls <class 'D1'>, name D1...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.