在Python3裏面,有多繼承的時候,每每會出現調用Super失敗的狀況。Python裏存在一種多繼承 Super的調用順序(C3算法
),保證每一個類調用一次。
體現:類名.__mro__
使用Super時,調用當前類的下一個類的方法python
屢次調用:算法
class Parent(object): def __init__(self,name): print('parent 開始調用') self.name = name print('Parent 調用完成') class Son1(Parent): def __init__(self,name,age): print('Son1 調用') self.age = age Parent.__init__(self,name) print('Son1 調用完成') class Son2(Parent): def __init__(self,name,gender): print('Son2 調用') self.gender = gender Parent.__init__(self, name) print('Son2 調用完成') class Grandson(Son1,Son2): def __init__(self,name,gender,age): print('Grandson 調用') self.gender = gender self.age = age Son1.__init__(self,name,age) #單獨調用父類方法 Son2.__init__(self,name,gender) print('Grandson 調用完成') s = Grandson('123','男',19) """ Grandson 調用 Son1 調用 parent 開始調用 Parent 調用完成 Son1 調用完成 Son2 調用 parent 開始調用 Parent 調用完成 Son2 調用完成 Grandson 調用完成 """
防止調用父類調用屢次code
class Parent(object): def __init__(self,name,*args,**kwargs): print('parent 開始調用') self.name = name print('Parent 調用完成') class Son1(Parent): def __init__(self,name,age,*args,**kwargs): print('Son1 調用') self.age = age super().__init__(self,name,*args,**kwargs) print('Son1 調用完成') class Son2(Parent): def __init__(self,name,gender,*args,**kwargs): print('Son2 調用') self.gender = gender super().__init__(self,name,*args,**kwargs) print('Son2 調用完成') class Grandson(Son1,Son2): def __init__(self,name,gender,age): print('Grandson 調用') self.gender = gender self.age = age super().__init__(name,gender,age) # == super(Grandson, self).__init__(name,gender) print('Grandson 調用完成') s = Grandson('123','男',19) """ Grandson 調用 Son1 調用 Son2 調用 parent 開始調用 Parent 調用完成 Son2 調用完成 Son1 調用完成 Grandson 調用完成"""
在 Python 中用到多繼承時,調用父類方法很容易出錯:父類方法調用了屢次,只能經過__mro__魔法方法來獲取調用順序繼承
print(Grandson.__mro__) #查看調用順序 """ (<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>) """ #super().__init__(name,gender,age) == super(Grandson, self).__init__(name,gender) super(Son1,self).__init__(name,age,gender) """ Grandson 調用 Son2 調用 parent 開始調用 Parent 調用完成 Son2 調用完成 Grandson 調用完成 """