菱形继承顾名思义,是一个菱形继承(好像是废话),直接上图
菱形继承就是多继承,例上图所有,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. 所以上面的打印结果如此,要仔细分析执行过程。
标签:__,面试题,调用,name,Python,init,菱形,print,super From: https://www.cnblogs.com/wangchengyang/p/16730895.html