MRO

2801 ワード

Python 3では、継承が多い場合、Super呼び出しに失敗することが多い.Pythonには、スーパーの呼び出し順序(C3 )を複数継承し、クラスごとに1回呼び出すことを保証するものがある.具現: .__mro__ Superを使用する場合、現在のクラスの次のクラスを呼び出す方法
複数呼び出し:
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     
"""

親呼び出しの複数回の呼び出しを防止
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__) #      
"""
(, 
, 
, 
, 
)
"""


#super().__init__(name,gender,age)   == super(Grandson, self).__init__(name,gender)



super(Son1,self).__init__(name,age,gender)

"""
Grandson   
Son2   
parent     
Parent     
Son2     
Grandson     
"""