Method Resolution Order : Method Resolution Order(MRO) 它表示编程语言解析方法或属性的方式。Python 支持从其他类继承的类。被继承的类称为父类或超类,而继承的类称为子类或子类。在 python 中,方法解析顺序定义了执行方法时搜索基类的顺序。首先,在类中搜索方法或属性,然后按照我们在继承时指定的顺序进行搜索。这个顺序也称为类的线性化,一组规则称为 MRO(方法解析顺序)。从另一个类继承时,解释器需要一种方法来解析通过实例调用的方法。因此我们需要方法解析顺序。例如
# Python program showing
# how MRO works
class A:
def rk(self):
print(" In class A")
class B(A):
def rk(self):
print(" In class B")
r = B()
r.rk()
输出:
In class B
在上面的示例中,调用的方法来自类 B 而不是来自类 A,这是由于方法解析顺序 (MRO)。 上面代码中遵循的顺序是-class B -> class A 在多重继承中,方法是按照继承类时指定的顺序执行的。对于支持单继承的语言,方法解析顺序没有什么意思,但是支持多继承的语言,方法解析顺序就起到了非常关键的作用。让我们看另一个例子来深入理解方法解析顺序:
在上面的示例中,调用的方法来自类 B 而不是来自类 A,这是由于方法解析顺序 (MRO)。 上面代码中遵循的顺序是-class B -> class A 在多重继承中,方法是按照继承类时指定的顺序执行的。对于支持单继承的语言,方法解析顺序没有什么意思,但是支持多继承的语言,方法解析顺序就起到了非常关键的作用。让我们看另一个例子来深入理解方法解析顺序:
# Python program showing``# how MRO works` `class` `A:`` ``def` `rk(``self``):`` ``print``(" In ``class` `A")``class` `B(A):`` ``def` `rk(``self``):`` ``print``(" In ``class` `B")``class` `C(A):`` ``def` `rk(``self``):`` ``print``("In ``class` `C")` `# classes ordering``class` `D(B, C):`` ``pass`` ` `r ``=` `D()``r.rk()
输出:
In class B
在上面的例子中我们使用了多重继承,也称为菱形继承,如下所示:
Python 遵循深度优先查找顺序,因此最终调用类 A 的方法。通过遵循方法解析顺序,查找顺序如下。 D类->B类->C类->A类 Python遵循深度优先顺序来解析方法和属性。所以在上面的例子中,它执行类 B 中的方法
。新旧样式顺序: 在旧版本的 Python(2.1) 中,我们必须使用旧式类,但在 Python(3.x & 2.2) 中,我们是只能使用新类。新样式类是其第一个父类继承自 Python 根“对象”类的类。
# Old style class``class` `OldStyleClass:`` ``pass` `# New style class``class` `NewStyleClass(``object``):`` ``pass
方法解析顺序(MRO)在两者的声明风格上是不同的。旧式类使用DLR 或深度优先从左到右算法,而新式类使用C3 线性化算法进行方法解析,同时进行多重继承。
DLR 算法 在实现多重继承的过程中,Python 构建了一个要搜索的类列表,因为它需要解决当实例调用一个方法时必须调用哪个方法。顾名思义,方法解析顺序将首先搜索深度,然后从左到右。例如
class` `A:`` ``pass` `class` `B:`` ``pass` `class` `C(A, B):`` ``pass` `class` `D(B, A):`` ``pass` `class` `E(C,D):`` ``pass
在上面的示例算法中,首先查看被调用方法的实例类。如果不存在,则查找第一个父项,如果也不存在,则查看父项的父项。这一直持续到类的深度结束,最后,直到继承类的结束。所以,在我们最后一个例子中,解析顺序将是 D、B、A、C、A。但是,A 不能出现两次,因此顺序将是 D、B、A、C。但是这个算法以不同的方式变化并且在不同的时间表现出不同的行为。所以Samuele Pedroni首先发现了一个不一致性并引入了C3 Linearization算法。
C3 线性化算法: C3线性化算法是一种使用新型类的算法。它用于消除由 DLR 算法产生的不一致。它有一定的局限性,它们是:
C3 线性化算法基于三个规则:
类的方法解析顺序 (MRO) 方法: 要获取类的方法解析顺序,我们可以使用 mro 属性或 mro() 方法。通过使用这些方法,我们可以显示解析方法的顺序。例如
# Python program to show the order``# in which methods are resolved` `class` `A:`` ``def` `rk(``self``):`` ``print``(" In ``class` `A")``class` `B:`` ``def` `rk(``self``):`` ``print``(" In ``class` `B")` `# classes ordering``class` `C(A, B):`` ``def` `__init__(``self``):`` ``print``("Constructor C")` `r ``=` `C()` `# it prints the lookup order``print``(C.__mro__)``print``(C.mro())
输出:
构造函数 C
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>) [<class '__main__.C'>, <class
' __main__.A'>, <class '__main__.B'>, <class 'object'>]
原文链接:codingdict.net