多继承的MRO顺序
多继承的菱形继承问题
格式:父类名.方法名()
子类:父类名.父类方法()
父类:父类名.父类方法()
会导致多继承的菱形继承问题:父类可能被调用两次
图示菱形继承问题:
菱形继承问题的解决方案:
- super().父类方法() 保证每个类只调用一次
按子类名.__mro __ 的顺序调用继承关系/super方法(mro得到顺序)(C3算法) - super(指定类名,self).父类方法() 根据mro顺序调用 指定类名 下一个类的方法
注:
- 单继承也有mro
- 继承不是复制,类比指向
- 多继承 super要传递所有的参数 多余的用args或kwargs保存 例如:
super().__init __(name, *args, **kwargs) # 为避免多继承报错,使用不定长参数,接受参数
- 单继承不能提供全部参数 例如:
super().__init __(name, age)