MRO
2801 ワード
Python 3では、継承が多い場合、Super呼び出しに失敗することが多い.Pythonには、スーパーの呼び出し順序(
複数呼び出し:
親呼び出しの複数回の呼び出しを防止
Pythonでマルチ継承を使用する場合、親メソッドを呼び出すとエラーが発生しやすくなります.親メソッドは複数回呼び出され、__しか使用できません.mro__呼び出し順序を取得する魔法の方法
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
"""