python 多继承

1、多继承 multiple inheritance

  多继承是指一个子类继承自两个或两个以上的基类。

  class 类名(基类名1, 基类名2, ...):

    pass

  【1】 一个子类同时继承自多个父类,父类中的方法可以同时被继承下来 

In [177]: # 此示例示意用多继承来派生新类
     ...: class Car:
     ...:     def run(self, speed):
     ...:         print('汽车以', speed, 'km/h的速度行驶')
     ...:
     ...:
     ...: class Plane:
     ...:     def fly(self, height):
     ...:         print("飞机以海拔", height, '米的高度飞行')
     ...:
     ...:
     ...: class PlaneCar(Car, Plane):
     ...:     '''PlaneCar类同时继承自汽车和飞机'''
     ...:
     ...:
     ...: p1 = PlaneCar()
     ...: p1.fly(10000)
     ...: p1.run(300)
飞机以海拔 10000 米的高度飞行
汽车以 300 km/h的速度行驶

  【2】 如果两个父类中有同名的方法,而在子类中又没有覆盖此方法时,调用结果难以确定

2、多继承存在的问题

  【1】标识符(名字空间)冲突的问题

In [178]: # 此示例示意多继承名字冲突问题
     ...: # 小张写了一个类A
     ...: class A:
     ...:     def m(self):
     ...:         print('A.m()被调用')
     ...:
     ...:
     ...: # 小李写了一个类B
     ...: class B:
     ...:     def m(self):
     ...:         print('B.m()被调用')
     ...:
     ...:
     ...: # 小王感觉小张和小李写的两个类自己可以用
     ...: class AB(A, B):
     ...:     pass
     ...:
     ...:
     ...: ab = AB()
     ...: ab.m()  #  请问会发生什么?
     ...:
     ...: a=AB.__mro__
     ...: print(a)
A.m()被调用
(<class '__main__.AB'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

  【2】 如果两个父类中有同名的方法,而在子类中又没有覆盖此方法时,调用结果难以确定

  要谨慎使用继承

3、多继承的 MRO (Method Resolution Order) 问题

  类的 __mro__ 属性

    此属性用来记录类的方法查找顺序

In [142]: class A:
     ...:     def go(self):
     ...:         print('A')
     ...:         # super().go()  # error
     ...:
     ...: class B(A):
     ...:     def go(self):
     ...:         print('B')
     ...:         super().go()
     ...:
     ...: class C(A):
     ...:     def go(self):
     ...:         print('C')
     ...:         super().go()
     ...:
     ...: class D(B, C):
     ...:     def go(self):
     ...:         print('D')
     ...:         super().go()
     ...:
     ...: d = D()
     ...: d.go()  #
     ...:
D
B
C
A

In [143]: print(D.__mro__)
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

 

posted @ 2020-12-31 16:55  昱成  阅读(396)  评论(0编辑  收藏  举报