MRO

Python3里面,有多继承的时候,往往会出现调用Super失败的情况。Python里存在一种多继承 Super的调用顺序(C3算法),保证每个类调用一次。
体现:类名.__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__) #查看调用顺序
"""
(<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 调用完成
"""

猜你喜欢

转载自www.cnblogs.com/donghaoblogs/p/10709922.html
MRO