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'>)