2010-11-20 89 views
25

我有這樣的代碼:如何避免super()的無限遞歸?

class A(object): 
    def __init__(self): 
      self.a = 1 

class B(A): 
    def __init__(self): 
     self.b = 2 
     super(self.__class__, self).__init__() 

class C(B): 
    def __init__(self): 
     self.c = 3 
     super(self.__class__, self).__init__() 

實例化B爲運行預期,但具體使用C無限遞歸併導致堆棧溢出。我該如何解決這個問題?

回答

46

當實例C調用B.__init__self.__class__仍然是C,所以超()調用最終會恢復到B

當調用超(),直接使用類名。因此在B中,請撥打super(B, self),而不是super(self.__class__, self)(並且在C中使用super(C, self))。從Python 3開始,你可以使用super()而不用參數來實現同樣的事情

+0

首先...用超級調用init是互聯網決定必須存在的一個主要問題。托馬斯正在描述它的作用......但是,爲什麼你要用init來運行一個超級用戶呢?這不是它的目的。 (該死的確定爲輸入的默認值)

想想這個......當你超級初始化時......你調用基類init,可能覆蓋你所做的所有工作。如果你堅持在init中使用super,請正確執行。 – 2010-12-08 17:56:26

+0

Ebral教授,請告訴我們,如果我們必須使用它的正確方法。 – nmz787 2014-06-24 03:22:09

+0

@ nmz787:在執行本地初始化之前,應該先調用super,問題會以相反的方式進行......好吧!我應該編輯這個問題,因爲這是不好的做法,不應該作爲例子。 – kriss 2015-09-08 09:57:07