MRO

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 調用完成
"""
相關文章
相關標籤/搜索