2015-09-27 86 views
0

在多重繼承中super()的工作原理是什麼? 比如這裏我有兩個初始化,我想送的超)ARGS(:多重繼承中無用的超級?

class LivingThings(object): 
    def __init__(self, age ,name): 
     self.name=name 
     self.age=age 

    def Print(self): 
     print('age: ', self.age) 
     print('name: ', self.name) 

class Shape(object): 
    def __init__(self, shape): 
     self.shape=shape 
    def Print(self): 
     print(self.shape) 

class Dog(LivingThings, Shape): 
    def __init__(self, breed, age , name, shape): 
     self.breed=breed 
     super().__init__(age , name) 
     super().__init__(shape) 


    def Print(self): 
     LivingThings.Print(self) 
     Shape.Print(self) 
     print('breed', self.breed) 

但錯誤:

super().__init__(shape) 
TypeError: __init__() missing 1 required positional argument: 'name' 

但此代碼的工作:

class Dog(LivingThings, Shape): 
    def __init__(self, breed, age , name, shape): 
     self.breed=breed 
     Shape.__init__(self, shape) 
     LivingThings.__init__(self,age ,name) 

所以super()劑量工作在多重繼承?

+0

它會,如果你正確實施 - 沒有超類使用超級,所以只有第一個被調用,並且他們有不同的簽名。 – jonrsharpe

+0

除了向這些'__init__'方法添加適當的'super()'調用外,還需要對它們進行更改以使它們都具有相同的調用簽名。簡單的方法是使用關鍵字參數的詞典,如Daniel Roseman所鏈接的Raymond Hettinger文章中的「ColoredShape」示例所示。 –

回答

4

super在多繼承中工作正常;這實際上正是它的目的。但出於某種原因,你用兩個不同的論點來稱呼它;這不是它的工作原理。

調用一次。這將調用方法解析順序中的下一個方法。那就是該方法的響應超級呼叫,來調用下一個方法。

請閱讀Raymond Hettinger的經典文章Super considered super

+0

那麼,這兩種父類型之間的超級構造關係是什麼? – user2864740

+0

對不起,我完全不理解這個問題。什麼關係? –

+0

Raymond Hettinger也將此作爲在Pycon 2015上的一次有趣的演講:http://www.youtube.com/watch?v=EiOglTERPEo –