当前位置: 首页 > news >正文

广州做网站一般要多少钱?市场营销的策划方案

广州做网站一般要多少钱?,市场营销的策划方案,模板网站 知乎,模板网站制作时间在 Python 中,MRO(Method Resolution Order,方法解析顺序)是指类继承体系中,Python 如何确定在调用方法时的解析顺序。MRO 决定了在多继承环境下,Python 如何寻找方法或属性,即它会根据一定规则…

在 Python 中,MRO(Method Resolution Order,方法解析顺序)是指类继承体系中,Python 如何确定在调用方法时的解析顺序。MRO 决定了在多继承环境下,Python 如何寻找方法或属性,即它会根据一定规则从父类中查找方法或属性,避免重复继承带来的歧义。

1. MRO 介绍

在 Python 中,类可通过多继承(即从多个父类继承)来获得不同父类的功能。为了避免由于多继承带来的冲突和不确定性,Python 使用了 MRO 来确定方法调用的顺序。

从 Python 2.3 [1]开始,Python 使用 C3 线性化算法 来决定类的 MRO。Python 的继承系统遵循该算法,这使得继承路径清晰且无二义性。

2. MRO 计算步骤

(1)MRO 计算步骤

  • 从当前类开始,将当前类添加到 MRO 列表的末尾。
  • 遍历当前类的基类列表。
  • 对于每个基类,如果它还没有被添加到 MRO 列表中,将其添加到 MRO 列表的末尾,并递归地重复步骤 2。
  • 如果基类列表为空,则结束。

(2)查看类的 MRO

在 Python 中,可通过 __mro__ 属性或内置的 mro() 方法来查看类的 MRO。如下所示:

class A:def foo(self):print("A")class B(A):def foo(self):print("B")class C(A):def foo(self):print("C")class D(B, C):pass# 查看类 D 的 MRO
print(D.__mro__)
# 或者
print(D.mro())

输出结果显示 D 类的 MRO 顺序:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

这个 MRO 表示 Python 将首先在 D 类中查找方法,如果没有找到,再去 B 类,然后是 C 类,接着是 A 类,最后是 object 类。

3. C3 线性化算法

(1)算法特性

  • 单调性:MRO 列表在继承过程中是单调的,这意味着一旦一个类被添加到 MRO 中,它就不会再被添加到后面的类中。
  • 非循环性:MRO 列表不会包含任何循环。
  • 保持子类顺序:如果一个类 B 继承自类 A 和类 C,那么 A 应该在 C 之前出现在 MRO 中。

(2)简单示例

假设有以下类继承关系,如下所示:

class A:passclass B(A):passclass C(A):passclass D(B, C):pass

MRO 计算过程,如下所示:

  • D 类的直接父类是 B 和 C,因此 MRO 将从这两个类开始。为了保证类 B 在类 C 之前解析(因为 B 在 D 类的声明中出现在前面),MRO 按顺序选择 B 和 C。
  • 然后,MRO 会解析 B 和 C 各自的父类 A,确保 A 只出现一次,且在 B 和 C 之后。
  • 最后,所有类都继承自 object 类。

这样最终 MRO 为 [D, B, C, A, object]

4. super() 函数与 MRO

在多继承中,super() 函数使用 MRO 来决定调用顺序。super() 会沿着 MRO 顺序依次调用下一个类的方法。如下所示:

class A:def foo(self):print("A")class B(A):def foo(self):super().foo()print("B")class C(A):def foo(self):super().foo()print("C")class D(B, C):def foo(self):super().foo()print("D")d = D()
d.foo()

这里 super() 将沿着 D 类的 MRO 顺序调用 foo() 方法。输出结果为:

A
C
B
D

这表明 Python 沿着 MRO 的顺序依次调用了 A -> C -> B -> D。简单理解,foo() 方法执行顺序与 D 类的 MRO 顺序相反。

5. MRO 解决的问题

(1)避免菱形继承问题

在多重继承中,如果不同的父类继承自同一个祖先类,MRO 确保这个祖先类的方法只会调用一次。

(2)保证方法查找的有序性

MRO 保证了在多继承中有明确的解析顺序,不会出现不确定性或冲突。

MRO 是 Python 中一个复杂但重要的概念,它通过 C3 线性化算法计算出一个类的所有基类的有序列表,这个列表决定了方法或属性在多重继承中的查找顺序。理解 MRO 有助于编写更清晰、更健壮的 Python 代码。

参考文献

[1] The Python 2.3 Method Resolution Order:https://www.python.org/download/releases/2.3/mro/

[2] Make MRO topological sorted:https://discuss.python.org/t/make-mro-topological-sorted/32300

NLP工程化(星球号)

http://www.khdw.cn/news/63196.html

相关文章:

  • 进出口外贸公司名字seo排名点击
  • 深圳响应式网站整合营销传播工具有哪些
  • 企业网站改版方案南京百度seo
  • 忽略的网站杭州网站seo外包
  • 富平做网站建网站用什么软件
  • wordpress推送失败西安seo优化排名
  • 网站建设要求广东公司搜索seo哪家强
  • 高端网站设计哪里比较好如何设计网站的首页
  • 在阿里巴巴网站上怎么做贸易seo综合查询爱站
  • 如何做分公司网站合肥网络公司seo建站
  • 杭州网官网北京优化seo公司
  • 滕州建设局网站百度快照入口
  • 企业网站设计怎么做徐州seo
  • 顺徳网站建设公司有哪些搜索优化推广公司
  • yum wordpress西安seo推广优化
  • 做网站买岩棉今日刚刚发生的国际新闻
  • github做网站速度快吗市场营销案例分析及解答
  • 校园网站建设 德育百度 站长工具
  • 如何维护网站建设百度推广话术全流程
  • 昆明官网seo服务南昌seo建站
  • 中国十大含金量证书厦门关键词优化平台
  • 网站建设公司网站建设专业品牌浙江疫情最新消息
  • 济南哪家公司做网站好网站维护费用
  • 昆山专业做网站独立站seo
  • 公司用dw做网站吗怎么弄属于自己的网站
  • 郑州 做网站seo教学网站
  • 怎么做网站排名会更好免费的外链网站
  • wordpress网页移动自己做seo网站推广
  • 自建博客网站属于b2b的网站有哪些
  • 做网站时候如果添加微信代码建立网站用什么软件