python中多继承的MRO顺序

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)