2011-05-19 95 views
6

至於我可以告訴大家,一切我一直在網上尋找,這應該工作(但它沒有,這就是爲什麼我問這裏;))Python超級() - 應該工作,但不是?

class Tigon(Crossbreeds, Predator, Lion): 

    def __init__(self): 
     super().__init__() 
    def printSize(self): 
     print("Huge") 

兩個「雜種」和「捕食者」從「哺乳動物」繼承,而「獅子」從Predator繼承。這些工作的彙編很好。我正在使用Python 3.2,儘管我也嘗試了更早版本:

編輯:對不起,我的文章的一部分沒有通過出於某種原因。

我也試過:

class Tigon(Crossbreeds, Predator, Lion): 

    def __init__(self): 
     super(Tigon, self).__init__() 
    def printSize(self): 
     print("Huge") 

和他們都遞給我:

class Tigon(Crossbreeds, Predator, Lion): 
TypeError: Cannot create a consistent method resolution 
order (MRO) for bases Predator, Mammal, Lion 

有什麼建議?

+0

你必須寫什麼不工作,所以我們可以幫助。 'super()'通常需要參數:http://docs.python.org/library/functions.html#super – viraptor 2011-05-19 10:58:33

+0

對不起,部分帖子沒有通過。現在編輯 – BIU 2011-05-19 11:02:07

+0

@viraptor:python 3中的super()不需要參數(儘管它仍然可以接受它們),並且如果沒有參數指定它們可能是有意義的。 – 2011-05-19 11:02:15

回答

0

應該是super().__init__(self)

編輯: 我道歉,你應該把Lion前:

class Tigon(Lion, Predator, Crossbreeds): 
    def __init__(self): 
     super().__init__() 
+0

這給了我同樣的錯誤 – BIU 2011-05-19 11:05:35

+0

@Jan - 你能告訴問題是什麼嗎? – BIU 2011-05-19 11:06:18

+0

@BIU:現在應該工作 – Kabie 2011-05-19 11:10:39

7

簡短的回答:不直接或間接地繼承相同的基類,但後直接繼承間接應該工作。因此,在Lion之後,不要繼承Predator或繼承

那麼,C3 MRO似乎無法找到與所有約束一致的任何順序。約束條件是:

  • 每個班必須拿出它的基類
  • 和基類之前必須進來,他們列出的順序。

你繼承Crossbreeds,依次PredatorLion,使他們的方法必須按照這個順序被調用。但由於Lion繼承Predator,它的方法必須在Predator之前調用。這是不可能的,因此它說它不能創建一致的方法解析順序。

+0

謝謝!我知道了。這意味着'(Crossbreeds,Lion,Predator)'應該可以工作,對吧? 這給了我另外一個問題 - 使用這個措辭,如果我想'Tigon'繼承'Lion'和'Predators'中定義不同的方法,我希望'Tigon'從'Predators '? – BIU 2011-05-19 11:22:47

0

如果我理解正確的,你所描述的繼承模型,這是你應該如何定義Tigon類:

class Mammal(object): 
    def __init__(self): 
     super(Mammal, self).__init__() 

class Crossbreeds(Mammal): 
    def __init__(self): 
     super(Crossbreeds, self).__init__() 

class Predator(Mammal): 
    def __init__(self): 
     super(Predator, self).__init__() 

class Lion(Predator): 
    def __init__(self): 
     super(Lion, self).__init__() 

class Tigon(Lion, Crossbreeds, Predator): 
    def __init__(self): 
     super(Tigon, self).__init__() 

t = Tigon() 

這種替代是等價的,因爲獅子是一個鐵血戰士:

class Tigon(Lion, Crossbreeds): 
    def __init__(self): 
     super(Tigon, self).__init__() 

現在這是一個快速的規則。每個類的構造函數在基類之後調用,但它們必須出現在類定義中的反向順序中。另外,覆蓋在其父類中定義的方法的類必須首先出現在類定義中 - 這意味着如果您想在Lion中覆蓋Predator的方法,那麼Lion應該在定義中出現在Predator之前。對此的較長解釋在Jan Hudec's answer

+0

請參閱[Jan的答案](http://stackoverflow.com/questions/6057540/python-super-should-be-working-but-isnt/6057743#6057743)瞭解爲什麼 – 2011-05-19 11:28:17

相關問題