python語言中多繼承中super調用所有父類的方法以及要用到的MRO順序
阿新 • • 發佈:2018-07-07
and tle 發生 姓名 pytho comm 報錯 不定長參數 param
在python多繼承中,利用super().父類方法,可以調用所有父類,從而在重寫的狀態下,再次對所有父類的調用!
例:
print("******多繼承使用super().__init__ 發生的狀態******")
class Parent(object):
def __init__(self, name, *args, **kwargs): # 為避免多繼承報錯,使用不定長參數,接受參數
print(‘parent的init開始被調用‘)
self.name = name
print(‘parent的init結束被調用‘)
class Son1(Parent):
def __init__(self, name, age, *args, **kwargs): # 為避免多繼承報錯,使用不定長參數,接受參數
print(‘Son1的init開始被調用‘)
self.age = age
super().__init__(name, *args, **kwargs) # 為避免多繼承報錯,使用不定長參數,接受參數
print(‘Son1的init結束被調用‘)
class Son2(Parent):
def __init__(self, name, gender, *args, **kwargs): # 為避免多繼承報錯,使用不定長參數,接受參數
print(‘Son2的init開始被調用‘)
self.gender = gender
super().__init__(name, *args, **kwargs) # 為避免多繼承報錯,使用不定長參數,接受參數
print(‘Son2的init結束被調用‘)
class Grandson(Son1, Son2):
def __init__(self, name, age, gender):
print(‘Grandson的init開始被調用‘)
# 多繼承時,相對於使用類名.__init__方法,要把每個父類全部寫一遍
# 而super只用一句話,執行了全部父類的方法,這也是為何多繼承需要全部傳參的一個原因
# super(Grandson, self).__init__(name, age, gender)
super().__init__(name, age, gender)
print(‘Grandson的init結束被調用‘)
print(Grandson.__mro__)
#利用
.__mro__方法查詢super在多繼承中調用父類的順序
gs = Grandson(‘grandson‘, 12, ‘男‘) print(‘姓名:‘, gs.name) print(‘年齡:‘, gs.age) print(‘性別:‘, gs.gender) print("******多繼承使用super().__init__ 發生的狀態******\n\n")
運行結果:
******多繼承使用super().__init__ 發生的狀態****** (<class ‘__main__.Grandson‘>, <class ‘__main__.Son1‘>, <class ‘__main__.Son2‘>, <class ‘__main__.Parent‘>, <class ‘object‘>) Grandson的init開始被調用 Son1的init開始被調用 Son2的init開始被調用 parent的init開始被調用 parent的init結束被調用 Son2的init結束被調用 Son1的init結束被調用 Grandson的init結束被調用 姓名: grandson 年齡: 12 性別: 男 ******多繼承使用super().__init__ 發生的狀態******
python語言中多繼承中super調用所有父類的方法以及要用到的MRO順序