Python的“超级”如何做正确的事情?

2023-11-29

我正在运行Python 2.5,所以这个问题可能不适用于Python 3。当您使用多重继承创建菱形类层次结构并创建最派生类的对象时,Python 会做正确的事情(TM)。它调用最派生类的构造函数,然后调用从左到右列出的其父类,最后调用祖父类。我对Python很熟悉MRO;这不是我的问题。我很好奇从 super 返回的对象实际上如何设法以正确的顺序与父类中的 super 调用进行通信。考虑这个示例代码:

#!/usr/bin/python

class A(object):
    def __init__(self): print "A init"

class B(A):
    def __init__(self):
        print "B init"
        super(B, self).__init__()

class C(A):
    def __init__(self):
        print "C init"
        super(C, self).__init__()

class D(B, C):
    def __init__(self):
        print "D init"
        super(D, self).__init__()

x = D()

该代码做了直观的事情,它打印:

D init
B init
C init
A init

但是,如果注释掉 B 的 init 函数中对 super 的调用,则 A 和 C 的 init 函数都不会被调用。这意味着 B 对 super 的调用在某种程度上知道 C 在整个类层次结构中的存在。我知道 super 返回一个带有重载 get 运算符的代理对象,但是 D 的 init 定义中 super 返回的对象如何将 C 的存在传达给 B 的 init 定义中 super 返回的对象?后续调用 super 使用的信息是否存储在对象本身上?如果是这样,为什么不是 super 而不是 self.super?

编辑:Jekke 非常正确地指出它不是 self.super 因为 super 是类的属性,而不是类的实例。从概念上讲这是有道理的,但实际上 super 也不是该类的属性!您可以在解释器中测试这一点,方法是创建两个类 A 和 B,其中 B 继承自 A,然后调用dir(B)。它没有super or __super__属性。


将您的代码更改为此,我认为它会解释事情(大概super正在看哪里,比如说,B在里面__mro__?):

class A(object):
    def __init__(self):
        print "A init"
        print self.__class__.__mro__

class B(A):
    def __init__(self):
        print "B init"
        print self.__class__.__mro__
        super(B, self).__init__()

class C(A):
    def __init__(self):
        print "C init"
        print self.__class__.__mro__
        super(C, self).__init__()

class D(B, C):
    def __init__(self):
        print "D init"
        print self.__class__.__mro__
        super(D, self).__init__()

x = D()

如果你运行它你会看到:

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

也值得一看Python 的 Super 很漂亮,但你不会用它.

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

Python的“超级”如何做正确的事情? 的相关文章

  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 根据列 value_counts 过滤数据框(pandas)

    我是第一次尝试熊猫 我有一个包含两列的数据框 user id and string 每个 user id 可能有多个字符串 因此会多次出现在数据帧中 我想从中导出另一个数据框 一个只有那些user ids列出至少有 2 个或更多string
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street

随机推荐

  • IE8后退按钮和动态内容

    我有一个页面 它提取外部 JavaScript 文件 然后该文件动态生成一些内容到该页面中 基本上插入一些 DIV 和 Flash 对象 当用户离开此页面然后按 后退 按钮时 Safari 和 Firefox 会显示生成的内容 但 IE 8
  • javaFX Tableview 数据不可见

    我尝试了所有方法来用数据填充 TableView 下一个代码在表中插入新行 但数据未出现在表中 我试图为此找到一个解释 但没有成功 请帮忙 我不知道出了什么问题 在控制器 java中 FXML private TableView
  • 如何使 llvm jit 在 MSVC++ 中工作

    看来 LLVM 中的 Kaleidoscopy 示例已经被破坏了 至少在 MSVC x64 中已经被破坏了一段时间 也许几个月 出于同样的原因 它在 MCJIT 和新的 Orc JIT 框架中不起作用 Get the address of
  • 根据关联模型的总和对玩家进行排序

    我有一个6500的数据库players每个玩家平均有15场比赛results Use case 我想生成一个玩家列表 按以下顺序排序sum他们的prize金钱 结果表中的一个字段 我更喜欢它在某种范围内 所以我还可以过滤玩家所在国家 地区的
  • 链接 PHP PDO 查询

    我不确定 链接 是否是正确的术语 但我要问的是是否可以进行类似于此 MySQLi 查询的 PDO 查询 sql mysqli fetch object db gt query SELECT username FROM member WHER
  • 由于 JavaScript 中不保证对象中的属性顺序,JSON.stringify() 的实际行为如何?

    Since JavaScript 中不保证对象中的属性顺序 如何JSON stringify 实际上表现如何 以下内容总是正确的 同一对象 吗 const o a 1 b 2 console log JSON stringify o JSO
  • ESRI:无法解析源映射

    我在 Google Chrome 开发者控制台中收到此错误 无法解析 SourceMap http localhost 15132 Scripts External igniteui css themes infragistics infr
  • https url 中的用户名和密码

    考虑一下网址 https foo 电子邮件受保护 上例中的用户名 密码部分是否符合 URL 参数 的条件 如中所定义这个问题 当您将用户名和密码放在主机前面时 该数据不会以这种方式发送到服务器 相反 它会根据所使用的身份验证模式转换为请求标
  • 如何用 SPS 和 PPS 数据填充 AVCodecContext 的“extradata”字段?

    问题是这样的 当解码 H264 流时ffmpeg 我可以获得SPS和PPS的原始数据 但我不知道如何将它们填充到extradata现场AVCodecContext 没有extradata 我无法正确解码帧 每次我打电话avcodec dec
  • 解析lxml中的html正文片段

    我正在尝试解析 html 片段 h1 title h1 img src I use lxml html fromstring 这让我发疯 因为它不断剥夺我的片段的标签 gt lxml html fromstring h1 a h1 tag
  • 读取RIP寄存器给出下一条指令的地址? [复制]

    这个问题在这里已经有答案了 我尝试读取x86 64寄存器的值rip 这是什么objdump shows 4017ec 48 8d 35 00 00 00 00 lea 0x0 rip rsi 4017f3 41 89 d4 mov edx
  • 从“mapend”函数到“Monoid”实例的函数?

    我有一个数据结构 它是玫瑰树的一个特定子类 形成具有最大下界和最低上界函数的格 并且它支持两个完全合理的函数作为Monoid班级的mappend 有什么办法支持匿名吗MonoidHaskell 中的实例 这是我应该考虑使用 Template
  • 无法识别的选择器发送到 NSKeyedUnarchiver 实例

    无法弄清楚为什么会不断抛出此错误 NSCFString bytes unrecognized selector sent to instance 0xc3eb200 对于这段代码 void parser SBJsonStreamParser
  • 从 Excel 运行 SQL Server 过程

    我正在使用 SQL Server 2008 Enterprise 我在一个数据库中创建了一个过程 该过程由对不同数据库的多个查询组成 并显示最终的组合结果集 我尝试通过 Excel 执行它 因此结果将自动显示在 Excel 工作表中 但我收
  • ARKit模板Xcode项目主线程检查器日志控制台

    我刚刚启动了一个新的 Xcode ARKit 项目并在物理设备上运行它 但在控制台中我得到以下输出 Main Thread Checker UI API called on a background thread UIApplication
  • 在 Microsoft 依赖注入中获取开放式通用服务

    假设我们有以下服务 interface IService interface IService
  • 如何使用 BehaviourSubjects 在 Angular 组件之间共享 API 调用的数据?

    我目前正在构建一个 Angular 应用程序 在其中向 api 发出请求 并将响应映射到两个不同的数组 我可以在我的app components ts但我会根据我的需要制作新的组件 如何在组件之间共享数据以确保组件始终拥有最新数据 因为我还
  • Maven 中默认的生命周期是什么

    我正在尝试学习 Maven 并通过以下语句Maven 文档 共有三个内置的构建生命周期 默认 干净和站点 默认生命周期处理您的项目部署 干净的 生命周期处理项目清理 而站点生命周期处理 创建项目的站点文档 还有另一份声明说 默认 或构建 这
  • SWIFT - 领域数据库加密不起作用

    我正在尝试加密领域数据库中存储的数据 我跟着示例代码Realm 上提到的快速页面 我想加密数据而不是数据库文件 下面是我正在使用的代码 var error NSError nil let configuration Realm Config
  • Python的“超级”如何做正确的事情?

    我正在运行Python 2 5 所以这个问题可能不适用于Python 3 当您使用多重继承创建菱形类层次结构并创建最派生类的对象时 Python 会做正确的事情 TM 它调用最派生类的构造函数 然后调用从左到右列出的其父类 最后调用祖父类