首页 > 其他 > 详细

MRO

时间:2019-04-15 12:29:39      阅读:137      评论:0      收藏:0      [点我收藏+]

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 调用完成
"""

MRO

原文:https://www.cnblogs.com/donghaoblogs/p/10709922.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!