使用super多继承及MRO顺序,解决菱形继承的父类二义性问题

情形:当一个类继承多个父类的时候,想要继承父类的__init__方法,可以使用 父类名.__init__(self) 方法时,但可能会出现父类二义性的问题(即多次调用父类__init__方法),可以使用super().__init__()方法继承父类的__init__方法。super方法继承可以解决菱形继承的父类二义性问题,super本质上就是使用MRO这个顺序去调用当前类在MRO顺序中的下一个类,super.__init__()则调用了下一个类的初始化方法进行构造。

关于MRO顺序,为了解决菱形继承出现的父类二义性的问题,python采用了一个算法将复杂结构上所有的类全部映射到一个线性顺序上,而根据这个顺序就可以保证所有的类都会被构造一次,这个顺序就是MRO顺序。

查看MRO顺序:

    类名.__mro__()   # 元组类型

    类名.mro   # 列表类型

class Human(object):
    def __init__(self):
        print("Human初始化开始")
        super().__init__()
        print("Human初始化完成")
        self.height = 180

class Man(Human):
    def __init__(self):
        print("man初始化开始")
        super().__init__()
        print("man初始化结束")


class Woman(Human):
    def __init__(self):
        print("woman初始化开始")
        super().__init__()
        print("woman初始化结束")


class Son(Man, Woman):
    def __init__(self):
        print("son初始化开始")
        super().__init__()
        print("son初始化结束")


son = Son()
print(Son.__mro__)
#print(Son.mro())

son初始化开始
man初始化开始
woman初始化开始
Human初始化开始
Human初始化完成
woman初始化结束
man初始化结束
son初始化结束
(<class '__main__.Son'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'>)
 

猜你喜欢

转载自blog.csdn.net/w18306890492/article/details/82898606