Python 多重继承
Python 多重继承
在本教程中,您将了解 Python 中的多重继承以及如何在程序中使用它。您还将了解多级继承和方法解析顺序。
Python 多重继承
一个类可以派生自 Python 中的多个基类,类似于 C++。这称为多重继承。
在多重继承中,所有基类的特性都被继承到派生类中。多重继承的语法类似于单继承。
示例
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
在这里,MultiDerived 类派生自 Base1 和 Base2 类。
<图>MultiDerived 类继承自 Base1 和 Base2 类。
Python 多级继承
我们也可以从派生类继承。这称为多级继承。它可以是 Python 中的任何深度。
在多级继承中,基类和派生类的特性被继承到新的派生类中。
下面给出一个带有相应可视化的示例。
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
在这里,Derived1 类派生自 Base 类和 Derived2 类派生自 Derived1 类。
<图>Python中的方法解析顺序
Python 中的每个类都派生自 object
班级。它是 Python 中最基础的类型。
所以从技术上讲,所有其他类,无论是内置的还是用户定义的,都是派生类,所有对象都是 object
的实例 类。
# Output: True
print(issubclass(list,object))
# Output: True
print(isinstance(5.5,object))
# Output: True
print(isinstance("Hello",object))
在多继承场景中,任何指定的属性都会首先在当前类中进行搜索。如果未找到,则以深度优先、左右方式继续搜索父类,而不搜索同一类两次。
所以,在上面的 MultiDerived
例子中 类搜索顺序为 [MultiDerived
, Base1
, Base2
, object
]。此顺序也称为 MultiDerived
的线性化 类和用于查找此顺序的规则集称为 方法解析顺序 (MRO) .
MRO 必须防止局部优先排序并提供单调性。它确保一个类总是出现在它的父类之前。如果有多个父类,则顺序与基类的元组相同。
一个类的MRO可以看成__mro__
属性或 mro()
方法。前者返回一个元组,后者返回一个列表。
>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>)
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>]
这是一个稍微复杂一点的多重继承示例及其可视化以及 MRO。
<图>
# Demonstration of 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
# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
print(M.mro())
输出
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
要了解MRO的实际计算算法,请访问MRO讨论。
Python