Javatpoint标志
Javatpoint标志

Python中的方法解析顺序

在本教程中,我们将学习方法解析顺序,也称为MRO。它是Python继承的一个基本概念。

方法解析顺序描述类的搜索路径Python用于在包含多继承的类中获取适当的方法。

介绍

如我们所知,被继承的类称为子类或父类,而继承的类称为子类或子类。在多重继承中,一个类可以由许多函数组成,因此使用方法解析顺序技术来搜索基类执行的顺序。

简单地说—“在当前类中搜索方法或属性,如果方法不在当前类中,则搜索移动到父类,依此类推”。这是一个深度优先搜索的例子。

它在多重继承中起着至关重要的作用,在多重继承中可以在多个超类中找到相同的方法。

为了更好地理解它,让我们看看如何使用它。

的例子,

输出:

我是C班的

解释,

上面的代码中有一个多重继承。我们定义了三个类,分别是A、B和C,这些类都有相同的命名方法的名字()。我们创建了一个对象类C。对象调用了类C,而不是类,而类C继承了类A的方法。

以上代码所遵循的顺序是B类- > A类。这种技术被称为MRO(方法解析顺序)。

让我们来理解另一个多重继承的例子。

的例子,

输出:

我是B班的

解释,

在上面的代码中,我们创建了另一个没有定义继承B类和C类的类属性的D类。当我们调用该方法时的名字(),它进入D类,寻找的名字()函数。但是D类没有任何声明。因此,搜索转移到类B,得到的名字()函数,并返回结果。搜索将按如下步骤进行。

如果类B没有方法,它将调用类C的方法。

在这里,我们建议您删除B类方法并检查会发生什么。通过这样做,您将了解方法解析是如何工作的。

新旧秩序

在旧版本的Python(2.1)中,我们被限制使用旧的类butPython(2.2 & continue),我们可以使用新的类。默认情况下,Python 3具有原始(新)类。新样式类的第一个父类继承自Python根'object'类。让我们看看下面的例子

的例子,

这两个类的声明风格是不同的。在方法解析中,旧式类遵循深度优先的从左到右算法(DLR),而新式类在执行多重继承时使用C3线性化算法。

DLR算法

Python在实现类之间的多重继承时创建了一个类列表。该列表用于确定实例调用哪个方法时必须调用哪个方法。

我们可以假设按照它的名字来工作,方法解析将首先搜索深度,然后从左到右搜索。下面是示例。

的例子,

首先,算法将在实例类中搜索被调用的方法。如果没有找到,就进入第一个父级,如果也没有找到。它将查看父节点的父节点。这将一直持续到继承类结束。

在上面的示例中,方法解析顺序将是-

但是A不能两次出现

这个算法显示了当时奇怪的行为。让我们看看下面的例子。

的例子,

根据DLR算法,顺序将是E, C, D, B, A。在C类中有A类和B类的互换,这是非常模糊的。这意味着该算法不保持单调性。

Samuele Perdoni是第一个发现MRO算法不一致的人。

C3线性化算法

C3线性化算法是DLR算法的一个更好的版本,因为它消除了不一致性。该算法有一些限制,如下所示。

  • 子女必须先于父母。
  • 如果一个特定的类继承自一个或多个类,它们将按照基类的元组中指定的顺序保存。

C3线性化算法的规则

  • 方法解析顺序的结构由继承图定义。
  • 只有在访问了局部类的方法之后,用户才必须访问超类。
  • 保持单调性

方法解析类的方法

Python提供了两种方法来获取类的方法解析顺序__mro__属性或mro ()方法。在这些方法的帮助下,我们可以显示它们被解析的方法顺序。

让我们来理解下面的例子。

的例子,

输出:

(<类的__main__。D'>, , <类“对象”>)[<类“__main__.C”>、<类的__main__。A'>, ]

正如我们在上面的输出中看到的,我们得到了方法解析顺序的顺序。这样,C3线性化算法适用于多重继承。


下一个话题 猴子在Python中的补丁





Youtube 视频加入我们的Youtube频道:现在加入

反馈


帮助别人,请分享

脸谱网 推特 pinterest

学习最新教程


准备


热门的技术


b .技术/马华






Baidu
map