Python 方法解析顺序

2023-12-12

有人可以解释给定代码的输出以及 python MRO 在这种情况下如何工作吗?

class A(object):
    def go(self):
        print("go A go!")


class B(A):
    def go(self):
        super(B, self).go()
        print("go B go!")


class C(A):
    def go(self):
        super(C, self).go()
        print("go C go!")


class D(C, B):
    def go(self):
        super(D, self).go()
        print("go D go!")


d = D()
d.go()

Output:

go A go!
go B go!
go C go!
go D go!

按照从左到右和深度,我认为应该是:

go A go!
go C go!
go D go!

但似乎它并不像我想象的那样工作。


班级的 MRO 基于其父级的 MRO:

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

The 三个规则 are:

  1. 孩子先于父母:
  • 一个
  • B < A
  • C < A
  • D < C
  • D < B
  1. 父母按碱基顺序排列:
  • C < B
  1. 父 mros 被合并,保留它们的顺序。
  • merge B < A < object with C < A < object

在 Python 2 的早期,搜索规则曾经是深度优先左非右,但基于对 C3 线性化算法的研究,这种规则发生了变化。

See the 超级考虑超级有关在实际代码中利用该算法的方法的博客文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 方法解析顺序 的相关文章

随机推荐

  • 为什么需要内存屏障?

    C 4 in a Nutshell 强烈推荐 使用以下代码来演示 MemoryBarrier 的概念 假设 A 和 B 在不同的线程上运行 class Foo int answer bool complete void A answer 1
  • Matlab 图形绘制 - 带标签的图例和曲线

    如何绘制如下图所示的图形 这里 图例 绿色 蓝色 在每条曲线上绘制了一些值 0 10 到 0 40 有没有可能的解决方案或提示来做到这一点 图参考 可以使用以下命令在行内绘制数据标签clabel 轮廓标签 尽管这要求您使用contour命令
  • 热通过cmd禁用buildnumber-maven-plugin

    我对 Maven 有疑问 如何通过命令行选项禁用 buildnumber maven plugin 我想在我们的持续集成服务器上运行 mvn test 命令 但是这个命令失败了 因为它试图构建一个版本并且没有访问我们的 vcs 的权限 在标
  • 用Java解析包含JS的HTML页面

    我正在尝试解析一个包含一些 JS 的网页 到目前为止我正在使用Jsoup在Java中解析html 它按预期工作 但我无法解析 JavaScript 下面是 HTML 页面的片段
  • grok 多条消息并用不同的标签处理它们

    我想在 Logstash 版本 2 4 中创建一个过滤器 在同一个 grok 中使用不同的匹配项 我想根据比赛添加不同的标签 基本上 我收到三种不同的消息模式 MAGIC 消息 REAL 消息 信息 我想做的是 grok match gt
  • 一个不错的 Java XML DOM 实用程序

    我发现自己一次又一次地编写同样冗长的 DOM 操作代码 Element e1 document createElement some name e1 setAttribute attr1 val1 e2 setAttribute attr2
  • 表格固定标题和可滚动正文

    我正在尝试使用 bootstrap 3 表制作一个具有固定标题和可滚动内容的表格 不幸的是 我发现的解决方案不适用于引导程序或搞乱风格 这里有一个简单的引导表 但由于某种原因我不知道 tbody 的高度不是 10px height 10px
  • ASP.NET 中的 XML POST 和解析

    如果有人将 XML 从应用程序发布到我的 ASP NET 页面 我如何解析它并以 XML 格式返回响应 将 XML 发布到我的 URL 的示例客户端代码 WebRequest req null WebResponse rsp null st
  • 升级 Android 项目中的领域

    我目前正在我的 Android 项目之一中运行 Realm 版本 0 82 0 我已经有一段时间没有接触 Realm 了 直到最近我注意到它们同时升级到了 2 0 2 版本 我想升级我的 Realm 版本 不幸的是 我不知道从旧版本升级到当
  • 在javafx中将纹理应用于网格

    我在使用 JavaFX 和 FXyz 0 1 1 将纹理应用到网格时遇到问题 I found 这个问题即使有详细的答案也无法弄清楚 我从头开始 准确地复制答案中的代码 场景是黑色的 没有可见的二十面体 我使用的是 Java 8 提供的图像是
  • 启动 asp.net 站点调试时 Visual Studio 2010 挂起

    我在 Windows 7 x64 上使用 Visual Studio 2010 时遇到问题 当我开始 ASP NET 站点调试时 它停止工作 唯一的解决方案是重新启动 IIS 有人有这方面的经验吗 Thanks 正如 Peter 提到的 通
  • 在 .NET Framework 4.0 中使用 TLS 1.2 时出现问题

    我禁用了 TLS 1 0 因此 我们尝试在使用 Net Framework 4 0 的 Net 应用程序中使用 TLS 1 2 我在开始时添加了此代码 System Net ServicePointManager SecurityProto
  • 如何在 JavaScript 中打开新选项卡而不切换到新选项卡?

    如何使用 javascript 打开新选项卡而不切换到新选项卡 例如 当用户单击链接时 将打开一个新选项卡 但用户应留在当前选项卡上 Web 浏览器会自动聚焦在新选项卡上 但您可以回调焦点 function openWindow url w
  • UITableViewCell 中的自动播放视频

    我已阅读了大部分问题StackOverflow用于自动播放视频 我可以在UITableView 但我遇到了一些如下所述的问题 视频开始时滚动会暂停一秒钟 视频播放前闪烁 如果向上滚动 视频不会自动播放 我想要的是像 Facebook 这样的
  • ElementList SimpleXML 中的空条目

    我的问题很简单 但我找不到任何相关信息 我有一个用于 XML 序列化的列表类和入口类 Root name entries public class List ElementList required false entry entry in
  • 如果您在页面中包含 2 个版本的 jQuery,如何将插件限制为仅使用其中一个?

    所以这个问题并不像乍听起来那么疯狂 我正在开发一段 JavaScript 代码以放入我的客户页面中 我担心的是他们是否在他们的网站上使用另一个版本的 jQuery 我知道从Jquery 文档像这样的事情应该有效 var dom dom qu
  • 在安装时创建没有管理员密码的 Windows 窗体应用程序设置

    我在 Visual Studio 中开发了一个 Windows 窗体应用程序 现在 我想在没有管理员权限的情况下在我的电脑上安装该 Windows 应用程序 我怎样才能创建一个设置 我已经在我的电脑上安装了 Photo Pad 图像编辑器应
  • Rc 依赖循环的最小示例是什么?

    我正在尝试编写一个泄漏内存的 Rust 程序由于具有引用计数的循环 下面的示例看起来应该会导致内存泄漏 但根据 Valgrind 的说法 它不会泄漏内存 是什么赋予了 test rs use std cell RefCell use std
  • 无法更新葫芦服务器版本

    更新 Calabash 服务器版本时出现问题 问题是我可以运行检查元素的基本测试 但是 一旦我尝试 触摸 按钮 葫芦就会返回 运行时错误 无法解析响应 该应用程序可能已崩溃 我相信问题的根源是我的服务器版本旧 不兼容 不是火箭科学 警告 服
  • Python 方法解析顺序

    有人可以解释给定代码的输出以及 python MRO 在这种情况下如何工作吗 class A object def go self print go A go class B A def go self super B self go pr