Python 3.1:C3 方法解析顺序

2024-05-01

钻石型继承的一个非常简单的例子:

class Root:
    def f(self):
        print('Root')

class A(Root): pass

class B(Root):
    def f(self):
        print('B')

class AB(A, B): pass

AB().f()

根据Python 3.1.2 文档 http://docs.python.org/py3k/tutorial/classes.html#multiple-inheritance:

对于大多数目的,以最简单的方式 情况下,你可以想到搜索 从父母继承的属性 类为深度优先,从左到右, 不在同一类中搜索两次 其中有重叠的地方 等级制度。

因此,我希望我的示例按以下顺序解析:AB -> A -> Root -> B。但事实并非如此。使用 ActiveState Python 3.1.2,输出是“B”而不是“Root”。

我缺少什么?

另外,我注意到 ActiveState Python 2.6 使用相同的代码打印“Root”。 2.6 和 3.1 之间的解析规则有变化吗?


Python 2.6 打印 Root 因为Root是一个老式的类。它应该打印B if Root继承自object(使其成为新式课程)。

旧式类不使用 C3 MRO,而是使用旧的有缺陷的 MRO,这正是您引用的文本所描述的。


B之所以出现在Root之前,是因为B也继承自Root。

AB的继承图为:

 AB - A - Root -- object
    \   /
      B

So:

mro(object) = [object]
mro(Root)   = [Root] + mro(object)   # mro of single-inherited class is simple...
            = [Root, object]
mro(A)      = [A, Root, object]
mro(B)      = [B, Root, object]

在多重继承的情况下,MRO 是通过从左到右获取超类 MRO 中的元素来计算的,不会出现在中间。在示例中更好地解释:

mro(AB) = [AB] + merge(mro(A), mro(B))
        = [AB] + merge([A, Root, object], [B, Root, object])   
        = [AB] + [A] + merge([Root, object], [B, Root, object])
           # A appears at head, pop it.
        = [AB] + [A] + [B] + merge([Root, object], [Root, object])
           # cannot pop Root because Root is not at head of [B, Root, object]
           # pop B instead.
        = [AB] + [A] + [B] + [Root] + merge([object], [object])
           # now we can pop Root because it only appears at the head position
        = [AB] + [A] + [B] + [Root] + [object]
        = [AB, A, B, Root, object] 

更多详细信息可以在http://www.python.org/download/releases/2.3/mro/ http://www.python.org/download/releases/2.3/mro/.

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

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

  • 如何导入Python文件?

    抱歉 这绝对是重复的 但我找不到答案 我正在使用 Python 3 这是我的应用程序的结构 home common py australia new south wales fetch py 我在home 目录 运行fetch py 我如何
  • 如何将同步函数包装在异步协程中?

    我在用着aiohttp https github com aio libs aiohttp构建一个 API 服务器 将 TCP 请求发送到单独的服务器 发送 TCP 请求的模块是同步的 对于我来说是一个黑匣子 所以我的问题是这些请求阻塞了整
  • 如何解码 dtype=numpy.string_ 的 numpy 数组?

    我需要使用 Python 3 解码按以下方式编码的字符串 gt gt gt s numpy asarray numpy string hello nworld gt gt gt s array b hello nworld dtype S1
  • 从另一个文件覆盖函数中的变量

    一 总结 我不知道如何从另一个文件覆盖函数中的变量 2 示例 2 1 配置 I use logbook http logbook pocoo org and pyfancy https github com ilovecode1 Pyfan
  • 如何更改Python使用的SQLite版本?

    我在 Debian 9 12 上安装了 Python 3 8 和 SQLite 3 16 2 并且需要升级到较新版本的 SQLite 我已经下载并编译了 SQLite 网站上提供的合并 并将其放入 usr bin 所以当我这样做时 sqli
  • Python 3:http.server 支持 ipv6 吗?

    Does http server http作为 Python 3 x 模块 支持 ipv6 例如 使用以下命令行代码 启动网络服务器 python m http server port 从 Python 3 8 开始 python m ht
  • Python 中 eval("input()") 和 eval(input()) 之间的区别

    我正在尝试以下功能 x eval input 输入为 123 x 的类型也是int 它工作正常 In 22 x eval input enter enter 123 In 24 print type x
  • 将 Python 3 与 AWS lambda 结合使用

    可以在 lambda 中使用使用 Python3 构建的应用程序 而不仅仅是 python2 7 可能会考虑周围的选择 https gun io blog announcing zappa serverless python aws lam
  • 无法在 python 中导入名称 GoogleMaps

    我使用下面的代码来获取地址的纬度和经度 from googlemaps import GoogleMaps gmaps GoogleMaps api key address Constitution Ave NW 10th St NW Wa
  • “初始化 MCI 时出现问题”播放声音问题

    我正在尝试使用 Playsound 播放代码文件夹中的文件 但是每次运行代码时 它似乎都能够调用该文件 但我总是收到以下输出 playsound PlaysoundException Error 277 for command open p
  • 计算网页内的字数

    我需要使用 python3 计算网页内的单词数 我应该使用哪个模块 网址库 这是我的代码 def web f urllib request urlopen https americancivilwar com north lincoln h
  • Tweepy 流式传输错误

    我正在尝试使用 tweepy 和 textblob 分析推文的情绪 我执行了 pip install tweepy 并且安装成功 但出现以下错误 错误信息 文件 C Users joshey Desktop sent py 第 2 行 位于
  • 重命名使用 Python Requests 下载的文件

    我怎样才能替换名字pdf使用 Python Requests 下载的文件 我想将其另存为Manual name1 pdf not as Elkinson 20Jeffrey pdf CSV 文件如下所示 Manual name1 https
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • python中将对象数据类型转换为字符串问题

    如何将对象数据类型结构转换为字符串数据类型 下面的方法不起作用 该列仍然存在object转换为字符串后 astype import pandas as pd df pd DataFrame country A B C D E df dtyp
  • Python 中的错误? threading.Thread.start() 并不总是返回

    我有一个很小的 Python 脚本 在我看来 threading Thread start 表现出意外 因为它不会立即返回 在线程内我想调用一个方法boost python基于对象 不会立即返回 为此 我将对象 方法包装如下 import
  • Python 3 sqlite 参数化 SQL 查询

    我一直在尝试使用 Python 3 和 sqlite 模块进行参数化 SQL 查询 并且仅使用一个变量就成功了 但是 当使用两个变量时 我得到一个IndexError tuple index out of range错误 关于导致此错误的原
  • Pandas groupby apply 执行缓慢

    我正在开发一个涉及大量数据的程序 我正在使用 python pandas 模块来查找数据中的错误 这通常工作得非常快 然而 我当前编写的这段代码似乎比应有的速度慢得多 我正在寻找一种方法来加快速度 为了让你们正确测试它 我上传了一段相当大的
  • 删除 HoloViews 中的 Bokeh 徽标

    是否可以从 HoloViews 生成的图中删除 Bokeh 徽标 没有什么反对的 只是在某些报告中显示它可能没有意义 我知道在 Bokeh 中我可以简单地执行以下操作 p bkp figure p toolbar logo None UPD
  • 将两个反斜杠替换为一个反斜杠

    我想用单个反斜杠替换带有两个反斜杠的字符串 但是 替换似乎不接受 作为替换字符串 这是解释器的输出 gt gt gt import tempfile gt gt gt temp folder tempfile gettempdir gt g

随机推荐

  • Google 文档自动保存如何工作?

    好吧 我知道这听起来很普通 但我指的是 AJAX 级别 我尝试过使用 Firebug 来跟踪 NET 连接和帖子 但这是一个谜 有谁知道他们如何在不破坏网络 浏览器的情况下不断进行即时自动保存 我的猜测 这只是一个猜测 是谷歌使用推送服务
  • try/catch 块中的完整代码

    我想知道 这是一个good practice放置complete code里面一个try block或者我应该放置only the code which I feel it will cause a specific exception 我
  • 为什么 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包

    我正在使用以下命令打开 TAP 设备 p gt fd open dev net tun O RDWR skipping error handling code ifr ifr flags IFF TAP IFF ONE QUEUE IFF
  • 如何交叉引用 Sphinx 中 autodoc 生成的函数?

    我正在使用Sphinx autodoc根据我的 Python 库的文档字符串生成文档的功能 找到交叉引用的语法here http sphinx doc org markup inline html ref role 该部分之前必须有一个标签
  • sed 仅在特定字符模式之间用空格替换破折号

    我有这样的行 ORIGINAL sometext1 sometext2 word A12 B34 C56 sometext3 sometext4 sometext5 sometext6 word A123 B45 C67 sometext7
  • Celery:有没有办法编写自定义 JSON 编码器/解码器?

    我有一些对象想要发送到我的应用程序上的 celery 任务 这些对象显然不能使用默认的 json 库进行 json 序列化 有没有办法让 celery 使用自定义 JSON 序列化 反序列化这些对象Encoder Decoder 这里有点晚
  • 为什么Java禁止内部接口的继承?

    IE 为什么以下 循环依赖 不可能 public class Something implements Behavior public interface Behavior 由于接口不引用外部类 因此应该允许这样做 然而 编译器强迫我在类之
  • 有没有办法使用无服务器框架来验证路径

    我在后端使用无服务器框架 使用AWS 我的 serverless yml 像这样 functions getBrand handler functions brand getBrand handler events http path se
  • Rails:基于关联值的ActiveRecord查询

    我有 2 个型号 Report and Server具有belongs to 和has many 关系 我使用创建了一个访问器方法delegate这允许Report来查找其关联的Server company id 现在 我想运行一个查询Re
  • ASP.Net Web Api 未在 POST 上绑定模型

    我正在尝试将 JSON 数据发布到 Web Api 方法 但 JSON 数据未绑定到模型 这是我的模型 DataContract public class RegisterDataModel DataMember IsRequired tr
  • 在 VB.NET 中对对象列表进行排序

    我有一个乘客 对象 列表 它具有不同的属性 passenger name passenger age passenger surname 我想按年龄标准对这个列表进行排序 我该怎么做 我知道在整数 字符串列表中 List Sort 有效 但
  • 在一个 Servlet 中同时处理

    我有一个 Servlet 它接收请求 必须处理 5 个任务 从外部服务器获取数据 并将所有数据发送回订购的客户端 如何同时处理5个任务并在5个任务全部完成后继续执行servlet代码 您可以使用CoundDownLatch http doc
  • Java 双epsilon

    我目前需要一个epsilon http en wikipedia org wiki Machine epsilon类型的double 首选 java 库中的常量 而不是自己的实现 定义 据我所知Double has MIN VALUE an
  • 如何在 C# 日期时间选择器中设置最大时间和最小时间

    我在 C Windows 窗体应用程序中使用日期时间选择器 如何设置最短时间和最长时间 我有一个字符串 07 52 22 我想将其设置为最大或最短时间 我怎样才能做到这一点 DatetimePicker MinDate TimeOfDay
  • ASCII - 代码点与字符编码

    我发现一篇有趣的文章 字符代码问题教程 http jkorpela fi chars html code http jkorpela fi chars html code 解释了术语 字符代码 代码点 和 字符编码 前者只是分配给一个字符的
  • 我是否使用 jQuery noconflict 来避免插件冲突?

    UPDATE 我发现jquery bxslider http bxslider com插件本身会克隆并附加 前置导致问题的 LI 但没有解决这个问题 除非使用另一个脚本 我不得不让 jQuery 插件部分地相互冲突 盒子滑块 http bx
  • 检查运行的代码是否为单元测试用例

    我想检查正在运行的代码是否是单元测试用例 或者不为结果执行不同的代码 例如 if unit test case is running do something else do other thing 对此有什么想法吗 这是一个糟糕的方法 您
  • ActionScript 3 中的圆形滑块

    我希望在 ActionScript 中添加一个圆形滑块 非常类似于这一页 http interface eyecon ro demos drag vr html shows 它最终会改变对象的色调 返回 CMY 值 但如果它只是吐出程度 我
  • 如何通过按删除按钮从 ListView 中删除选定的项目?

    我想从 ListView 中删除一个或多个选定的项目 最好的方法是什么 我正在使用 C 和 dotnet Framework 4 您可以通过迭代来删除所有选定的项目ListView SelectedItems http msdn micro
  • Python 3.1:C3 方法解析顺序

    钻石型继承的一个非常简单的例子 class Root def f self print Root class A Root pass class B Root def f self print B class AB A B pass AB