上一章Python教程请查看:python3继承
在本文中,你将了解Python中的多重继承是什么,以及如何在程序中使用它,你还将了解多级继承和方法解析顺序。
Python中的多重继承
与c++一样,一个类可以派生自Python中的多个基类,这叫做多重继承。
在多重继承中,所有基类的特性都被继承到派生类中,多继承的语法类似于单继承。
例子:
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
这里,MultiDerived派生自Base1和Base2类。
Python中的多重继承解释
类MultiDerived继承自Base1和Base2。
另一方面,我们也可以从派生类继承,这称为多级继承,它可以是Python中的任何深度。
在多级继承中,基类和派生类的特性被继承到新的派生类中。
下面给出了一个相应的可视化示例。
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
这里,Derived1是从Base派生出来的,而Derived2是从Derived1派生出来的。
Python中的方法解析顺序
Python中的每个类都派生自类对象,它是Python中最基本的类型。
因此,从技术上讲,所有其他类,无论是内置的还是用户定义的,都是派生类,所有对象都是object类的实例。
# 输出: True
print(issubclass(list,object))
# 输出: True
print(isinstance(5.5,object))
# 输出: True
print(isinstance("Hello",object))
在多继承场景中,任何指定的属性都首先在当前类中搜索,如果没有找到,搜索将继续以深度优先、从左到右的方式进入父类,而不会搜索相同的类两次。
因此,在上述多派生类的示例中,搜索顺序是[MultiDerived, Base1, Base2, object]。这个顺序也被称为多导类的线性化,用来发现这个顺序的规则集被称为方法分辨顺序(MRO)。
MRO必须防止局部优先排序,并提供单调性。它确保一个类总是出现在它的父类之前,并且在有多个父类的情况下,顺序与基类的元组相同。
类的MRO可以被看作是_mro__属性或MRO()方法,前者返回一个tuple,而后者返回一个列表。
>>> MultiDerived.__mro__
(,
,
,
)
>>> MultiDerived.mro()
[,
,
,
]
下面是一个稍微复杂一点的多重继承示例及其与MRO一起的可视化。
class X: pass
class Y: pass
class Z: pass
class A(X,Y): pass
class B(Y,Z): pass
class M(B,A,Z): pass
# 输出:
# [, ,
# , ,
# , ,
# ]
print(M.mro())