2009-12-24 87 views
5

在蟒蛇2.x中,超級接受下列情況下爲什麼python super不接受實例?

class super(object) 
| super(type) -> unbound super object 
| super(type, obj) -> bound super object; requires isinstance(obj, type) 
| super(type, type2) -> bound super object; requires issubclass(type2, type) 
| Typical use to call a cooperative superclass method: 

據我所見,超一類,包裝類型和(最終)實例解析類的超類。

我對幾件事情頗爲不解:

  • 爲什麼也沒有super(instance),具有典型的使用例如super(self).__init__()。從技術上講,您可以從對象本身獲取對象的類型,因此當前策略super(ClassType, self).__init__()是多餘的。我假定與舊式類或多重繼承存在兼容性問題,但我想聽聽你的觀點。
  • 另一方面,爲什麼python 3會接受(見Understanding Python super() with __init__() methodssuper().__init__()?在這方面我看到了一種魔法,違反明示比隱含的禪更好。我會看到更合適的self.super().__init__()

回答

6

super(ClassType, self).__init__()冗餘用於在協同多繼承方案 - ClassType不一定是self類型,但該類從中你想做的合作調用__init__

在類層次C inherits B inherits A,在C.__init__要從C's角度稱之爲父類的初始化,並調用B.__init__;那麼在B.__init__中,您必須將類類型B傳遞給super - 因爲您想要解析B的調用超類(或者說,類C的B之後的mro中的下一個)。

class A (object): 
    def __init__(self): 
    pass 

class B (A): 
    def __init__(self): 
    super(B, self).__init__() 

class C (B): 
    def __init__(self): 
    super(C, self).__init__() 

,如果你現在實例c = C(),你看到類類型不是多餘的 - super(self).__init__()B.__init__就沒有真正的工作!你要做的是手動指定調用super的方法在哪個類中(這是通過指向方法類的隱藏變量在Python 3的超類中解決的)。

+0

我想你的意思是B類(A):和C類(B): – 2009-12-24 12:47:49

+0

然而,你是對的。它永遠無法從B調用A .__ init __(),因爲在方法B中.__ init __()self將是C類型的,它的直接super是B,而不是A.因此B .__ init __()會再次被調用。 – 2009-12-24 12:50:43

+0

啊你對錯字說得對,謝謝!這在多重繼承方案中變得更加複雜,我想我可以找到一個關於這個的鏈接。 – u0b34a0f6ae 2009-12-24 15:57:34

3

我無法提供具體的答案,但是您是否閱讀過super關鍵字的PEP?我做了一個快速谷歌搜索,它想出了PEP 367和PEP 3135

http://www.python.org/dev/peps/pep-0367/

http://www.python.org/dev/peps/pep-3135/#numbering-note

不像我所知道的任何其他語言,大部分的時間,你可以找到你Python的PEP的怪癖以及明確的理性和立場聲明。

更新:

已經通過3135讀取,在Python郵件和語言相關的電子郵件中引用它種很有意義爲什麼它的方式是對Python的2比Python 3的

http://docs.python.org/library/functions.html?highlight=super#super

我認爲超級被實現爲明確/多餘只是爲了安全一方,並保持儘可能簡單的邏輯(沒有糖或深層的邏輯來找到父母)。由於super是內建函數,因此必須從所提供的內容中推斷出正確的返回,而不會增加Python對象的結構複雜性。

PEP 3135改變了一切,因爲它提出並贏得了超級DRY'er方法的論點。

+0

我同意,但我試圖得到一個答案,在同一時間的問題_while_增加:

兩個超和多重繼承的例子鏈接stackoverflow信息。 – 2009-12-24 08:01:47

+0

@Stefano在我做了我原來的帖子後,我開始思考同樣的事情。 – David 2009-12-24 08:14:36

相關問題