Python菱形继承(网易面试题)

菱形继承顾名思义,是一个菱形继承(好像是废话),直接上图

 

 菱形继承就是多继承,例上图所有,A是父类,B和C是A的子类,B和C是D的父类。

class Parent(object):
    def __init__(self, name):
        print('Parent开始被调用')
        self.name = name
        print('Parent结束被调用')
        

class Son1(Parent):
    def __init__(self, name, age, *args, **kwargs):
        print('Son1开始被调用')
        self.age = age
        super().__init__(name, *args, *kwargs)
        print('Son1结束被调用')


class Son2(Parent):
    def __init__(self, name, gender, *args, **kwargs):
        print('Son2开始被调用')
        self.gender = gender
        super().__init__(name, *args, **kwargs)
        print('Son2结束被调用')


class UserFroile(Son1, Son2):
    def __init__(self, name, age, gender):
        print('UserFroile开始被调用')
        super().__init__(name, age, gender)
        print('UserFroile结束被调用')


print(UserFroile.__mro__)

UF = UserFroile('wangchengyang', 21, '')
print("姓名:", UF.name)
print("年龄:", UF.age)
print("性别:", UF.gender)

结果如下:

 

注意:在上面模块中,当在子类中通过super调用父类方法时,parent被执行了1次。

super调用过程:上面gs初始化时,先执行grandson中init方法, 其中的init有super调用,每执行到一次super时,都会从__mro__方法元组中顺序查找搜索。所以先调用son1的init方法,在son1中又有super调用,这个时候就就根据__mro__表去调用son2的init,然后在son2中又有super调用,这个就根据mro表又去调用parent中的init,直到调用object中的init. 所以上面的打印结果如此,要仔细分析执行过程。

 

posted @ 2022-09-26 14:33  非非非常帅的辰  阅读(195)  评论(0编辑  收藏  举报