1. 程式人生 > >python語言中多繼承中super調用所有父類的方法以及要用到的MRO順序

python語言中多繼承中super調用所有父類的方法以及要用到的MRO順序

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順序