簡體   English   中英

Python 2中對type .__ init__的困惑

[英]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...

我對結果感到困惑,

  1. 為什么即使我們還沒有創建D2的實例,也要為D2調用Base.__init__
  2. 由於D2調用了Base.__init__ ,為什么D1不能呢?

首次執行時會調用Base.__init__

M = Base('M', (object,), {})

您正在創建Base的實例,因此調用了它的__init__方法,這不足為奇。

在創建D2時第二次調用該方法,因為創建類將調用作為Base元類 (是,該類的類)的__init__方法。 D2Base一個實例。

因為D1Base的子類型/子類,而不是它的實例,所以不為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM