python中多继承的MRO顺序
- python中是支持多继承的,但是多继承容易导致代码混乱,所以不推荐这种写法。
- 访问父类有三种方法:
父类名.父类方法(self):这种方式容易造成父类方法被调用多次的问题(不推荐),super(指定某个类名, self).父类方法()和super().父类方法()。 - 多继承:一个类可以有多个父类, 在类的多继承中,如果继承多个父类方法,调用父类方法时(父类名.方法),会造成父类方法中某些数据被重复调用,所以建议使用super()方法。
- MRO:当在一个子类中使用super()方法调用父类时,不能简单的认为就是调用了父类,而需要通过
类名.__mro__查找出来当前类的调用顺序,它的顺序由C3算法来决定,以保证每一个类只调用一次。
示例代码:
class Parent(object):
def __init__(self):
print('parent的init被调用')
class Son1(Parent):
def __init__(self):
print('Son1的init被调用')
super().__init__()
class Son2(Parent):
def __init__(self):
print('Son2的init被调用')
super().__init__()
class Grandson(Son1, Son2):
def __init__(self):
print('Grandson的init被调用')
#super(Son2, self).__init__()
super().__init__()
gs = Grandson()
print("MRO的执行顺序为:", Grandson.__mro__)
输出结果:
Grandson的init被调用
Son1的init被调用
Son2的init被调用
parent的init被调用
MRO的执行顺序为: (<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>)
上例代码实现了一个多继承,可以看到多继承父类只会被调用一次,并且调用的顺序是完全按照MRO顺序。
如果使用super(Son2, self).__init__()调用,则执行的是MRO顺序中Son2之后的:
Grandson的init被调用
parent的init被调用
MRO的执行顺序为: (<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>)
单继承用哪种方式调用父类方法都可以,基本上无差别,但是建议super()的方式。
本文探讨了Python中多继承的MRO顺序及其重要性,介绍了如何使用super()方法正确调用父类方法,避免重复调用问题。通过示例代码展示了C3算法决定的MRO顺序,确保每个类仅被调用一次。

2897

被折叠的 条评论
为什么被折叠?



