Python super() 参数:为什么不是 super(obj)?

2024-02-24

我试图了解何时以及如何在 Python 中正确使用 super() (2.7.x 或 3.x)

on >>> help(super)解释器告诉我如何称呼它:

class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)

我知道在 Python3.x 中现在可以在类定义中使用 super(),但我不明白为什么super(obj)不可能。或者super(self)在类定义内。

我知道这一定是有原因的,但我找不到。对我来说这些行相当于super(obj.__class__, obj) or super(self.__class__, self)那些会起作用吗?

我认为只需输入super(obj)即使在 Python 3.x 中也是一个不错的快捷方式。


只有 Python 2 才需要双参数形式。原因是self.__class__始终引用继承树中的“叶”类——即对象的最具体的类——但是当您调用super您需要告诉它当前正在调用哪个实现,以便它可以调用继承树中的下一个实现。

假设您有:

class A(object):
   def foo(self):
      pass

class B(A):
   def foo(self):
      super(self.__class__, self).foo()

class C(B):
   def foo(self):
      super(self.__class__, self).foo()

c = C()

注意c.__class__ is C, 总是。现在想想如果你打电话会发生什么c.foo().

你打电话时super(self.__class__, self)在 C 的方法中,就像调用super(C, self),意思是“调用C继承的这个方法的版本”。那会调用B.foo,这很好。但当你打电话时super(self.__class__, self)来自B,仍然像打电话super(C, self),因为它是相同的self, so self.__class__还是C。结果是B中的调用又会调用B.foo并发生无限递归。

当然,你真正想要的是能够调用super(classThatDefinedTheImplementationThatIsCurrentlyExecuting, self),这实际上就是 Python 3 所做的super() does.

在Python 3中,你可以这样做super().foo()它做了正确的事。我不清楚你的意思super(self)是一条捷径。在 Python 2 中,由于我上面描述的原因,它不起作用。在Python 3中,这将是一个“longcut”,因为你可以只使用简单的super()反而。

The super(type) and super(type1, type2)在 Python 3 中偶尔可能仍然需要使用这些用法,但对于不寻常的情况,这些用法总是更加深奥。

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

Python super() 参数:为什么不是 super(obj)? 的相关文章

  • 从 Excel 获取输入并在 python 脚本中使用这些输入

    如何从 excel 获取输入并在 python 中使用这些输入 看一眼xlrd http pypi python org pypi xlrd 这是我发现的学习如何使用它的最佳参考 http www dev explorer com arti
  • c++11 正则表达式比 python 慢

    嗨我想了解为什么以下代码使用正则表达式进行分割字符串分割 include
  • 如何在anaconda python 3.6上安装tensorflow

    我使用 anaconda 包安装了新版本的 python 3 6 但是我无法安装张量流 总是收到这样的错误 tensorflow gpu 1 0 0rc2 cp35 cp35m win amd64 whl 在此平台上不受支持 如何在 ana
  • 让 Django 提供可下载文件

    我希望网站上的用户能够下载路径被遮挡的文件 因此无法直接下载它们 例如 我希望 URL 是这样的 http example com download f somefile txt 在服务器上 我知道所有可下载的文件都位于该文件夹中 home
  • 如何从 Windows 7 PC 上完全卸载 Python 2.7

    从这里安装了Python 2 7 https www python org downloads release python 279 https www python org downloads release python 279 然后我
  • 来自多元 t 分布的样本 python

    我想知道Python中是否有一个从多元学生t分布中采样的函数 我有包含 14 个元素的均值向量 14x14 协方差矩阵和自由度 我想从这个 t 分布中采样一个向量 对于一维情况 我使用 stats t rvs df loc scale 并且
  • 以编程方式结束/退出粘合作业

    我正在使用 Glue 书签来处理数据 我的工作是每天安排的 但也可以 手动 启动 由于我使用书签 有时胶水作业可以在没有新数据要处理的情况下启动 然后读取的数据帧为空 在这种情况下 我想好好地结束我的工作 因为它没有什么关系 我试过 if
  • 如何使用 django Rest 框架保存多对多字段对象

    我有博客 发布 标签三个模型 在博客模型中 我将字段 postedin 作为发布模型的外键 将 标签 作为标签模型的许多字段 模型 py class Posted models Model name models CharField Pos
  • 我可以在pycharm中的断点处进入交互模式吗

    我是一个相当新的 Pycharm 3 用户 正在从事 django 项目 我可以在 pycharm3 中的断点处进入交互模式吗 这可能吗 当程序在断点处停止时 我尝试过工具 gt 打开调试命令行 但我没有看到控制台打开 我怎样才能让它发挥作
  • R.scale() 和 sklearn.preprocessing.scale() 之间的区别

    我目前正在将数据分析从 R 转移到 Python 当在 R 中缩放数据集时 我将使用 R scale 根据我的理解 它将执行以下操作 x mean x sd x 为了替换该函数 我尝试使用 sklearn preprocessing sca
  • 将具有多个时区的 pandas 列转换为单个时区

    Problem 我在 pandas DataFrame 中有一个列 其中包含带有时区的时间戳 此列中有两个不同的时区 我需要确保只有一个 这是该列末尾的输出 260003 2019 05 21 12 00 00 06 00 260004 2
  • django-allauth:电子邮件确认

    我已经设置了 django allauth 并在新用户注册时使用电子邮件确认 效果很好 但在确认电子邮件中 我得到 Hello from example com You re receiving this e mail because us
  • __author__ 的起源是什么?

    使用私有元数据变量的约定在哪里 author 一个模块内部从何而来 This http mail python org pipermail python dev 2001 March 013328 htmlPython 邮件列表线程似乎暗示
  • 在python中检测按下了哪些键

    我需要知道现在按下的是哪个键 我不想捕获一些特定的按键来触发事件或类似的事情 我想知道现在按下了哪些键并显示它们的列表 我还需要捕获特殊键 如 F1 F12 shift alt home windows 等 基本上是键盘上的所有键 我如何在
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • Hoare Partitioning算法讲解

    根据许多网站给出的伪代码 我写了这个Hoare分区算法 它采用一个数组 根据给定的主元来分区子数组的开始和结束索引 它工作得很好 但是有人可以解释一下逻辑 它是如何做到这一点的吗 这是代码 def hoare arr start end p
  • 内置模块位于哪里?

    我尝试查找列出的所有目录sys path但我找不到任何builtins py文件 那么它在哪里呢 从字面上看 该模块内置于 python 解释器中 gt gt gt import builtins gt gt gt builtins
  • Pandas 数据框可对多列和要列出的值进行字典

    我有一个数据框 id key a1 1 a2 1 a3 1 a4 2 a5 2 a6 3 我想创建一本字典key作为机器号 并且id列作为列表 like 1 a1 a2 a3 2 a4 a5 3 a6 我可以先使用 groupby 然后再使
  • 重写 __cmp__ python 函数

    嗨 我是压倒一切的 cmp 如果传递的第二个对象是None 或者如果它不是一个实例someClass 然后返回 1 我不明白这里到底发生了什么 class someClass def cmp self obj if obj None ret
  • 如何使用多阶段构建减小 python (docker) 图像大小?

    我正在寻找一种使用 python 和 Dockerfile 创建多阶段构建的方法 例如 使用以下图像 第一张图片 安装所有编译时要求 并安装所有需要的 python 模块 第二张图片 将所有已编译 构建的包从第一个映像复制到第二个映像 而不

随机推荐

  • 从 WCF 客户端使用非 wcf SOAP 错误(定义了 SOAP 错误)

    我有一个从 WCF 客户端调用的非 WCF 服务器 我需要访问已注册的肥皂故障 以防服务器抛出它 它包含我需要用户的反馈 我使用了来自的例子如何从 WCF 客户端访问 SOAP 1 1 错误详细信息 无错误契约 https stackove
  • 使用 Java 进行 MongoDB ISODate 字段搜索

    我在使用 Java 搜索 mongodb 中的 ISODate 字段时遇到问题 我想找到完全匹配的日期 以下是我查询第一个集合并获取 ISODate 字段 Timestamp 的方法 一旦我得到这个日期 我想搜索具有相同 时间戳 值的另一个
  • FxCop 和代码分析规则

    我最近开始在 Visual Studio 中的项目中使用代码分析 我创建了一个自定义规则集 用于我的所有项目 其中包括两个 Microsoft 定义的规则集 我一直致力于将 FxCop 集成到 CI 构建过程中 以使未通过所有规则的构建失败
  • 我如何使用 Rugged 来创建和提交文件,就像从命令行一样?

    我正在尝试使用坚固的东西来做一些非常简单的事情 创建并提交一个文件 使存储库处于与执行相同的状态 git init echo blah blah blah gt blah txt git add blah txt git commit m
  • 围绕三角形画布旋转圆

    我想使用画布围绕三角形旋转一个圆 前面有这段代码 但这是中间的圆 还有一个旋转的矩形 我希望圆旋转并在中间有一个三角形 有人可以帮忙吗 这是我的JS代码 var canvas document getElementById canvas v
  • 如何正确使用run_in_executor?

    我尝试使用run in executor并有一些问题 这是代码 基本上是从文档复制粘贴 import asyncio import concurrent futures def cpu bound val CPU bound operati
  • Yii 将数据从一个模型复制到另一个模型

    我是 yii 的新手 我使用扩展的模型从表单中收集数据CFormModel在控制器内部我想将这些数据复制到一个扩展自的模型CActiveRecord为了保存到数据库 是否有一种方法或方式将数据从数据收集模型复制到数据保存模型 而不是通过属性
  • pythonw.exe 还是 python.exe?

    长话短说 pythonw exe什么也没做 python exe不接受任何内容 我应该使用哪一个 test py print a 命令窗口 C path gt pythonw exe test py
  • 了解addChildViewController的使用

    我正在处理一些需要重构的代码 视图控制器充当其他两个视图控制器的容器 并将在它们之间交换 如下面的代码所示 这可能不是最好的设计 可能不需要以这种方式交换视图控制器 我明白那个 但是 当我使用此代码时 我想进一步了解 addChildVie
  • file_exist 放置在 php 函数内时不起作用

    我已经寻找过几乎类似的问题但这些都没有给我正确的答案 我有一个完全workingif else 语句中的 file exist 代码在这里 但是当我将它放在一个函数中时它就不再起作用了 这是代码 if file exists SERVER
  • Python:打开文件而不创建锁

    我正在尝试用 Python 创建一个脚本来备份一些文件 但是 这些文件可以随时重命名或删除 我不希望我的脚本通过锁定文件来阻止这种情况 在备份过程中 该文件应该仍然可以随时删除 我怎样才能在Python中做到这一点 而且 会发生什么 如果无
  • 如何使用隐藏代码创建自定义注释

    我想创建我自己的自定义注释 我的框架是独立的 Java 应用程序 当有人注释他的 pojo 类时 后面的 隐藏 代码将触发方法 例如 今天在 Java EE 中我们有 MessageDriven注解 当你用注释你的类时 MessageDri
  • 模拟 Pylons 中的 url 对象

    我想测试一个调用 pylons url 对象的方法 然而在测试中调用它会导致错误 TypeError No object name url has been registered for this thread 所以我想用模拟库中的模拟替换
  • Elasticsearch java 客户端初始化失败

    我在尝试运行连接到 elasticsearch 的应用程序时收到此错误消息 An attempt was made to call the method org elasticsearch client RestHighLevelClien
  • Eclipse中如何根据字段注释自动生成getter/setter注释?

    我希望 Eclipse 根据先前定义的字段注释自动为我的 getter 和 setter 方法生成 Javadoc 注释 我怎样才能实现这个目标 背景 我们公司的一项政策是对每个方法和字段进行注释 即使它们具有不言自明的名称 因此 我必须通
  • 在Python中,如何计算两个数据数组之间的相关性和统计显着性?

    我有一组包含两个同样长的数据数组的数据 或者我可以创建一个包含两项条目的数组 并且我想计算数据所代表的相关性和统计显着性 可能是紧密相关的 或者可能有没有统计学上显着的相关性 我正在用 Python 编程 并安装了 scipy 和 nump
  • 创建等腰梯形形状

    我想知道是否可以用 CSS 生成类似的东西 我也想知道 这是提出这样问题的合适地方吗 我没有尝试过任何代码 我已经用 Photoshop 完成了棕色图像 谢谢你的帮助 这个形状 一个等腰梯形 http en wikipedia org wi
  • 如何在c中将数组的值分配给另一个数组(制作副本)?

    我想复制二维数组并将其分配给另一个数组 在Python中我会做这样的事情 grid a b c d e f g h i grid copy grid 我想在 C 中做同样的事情 char grid 3 3 a b c d e f g h i
  • 我可以预期的多线程“现实世界”性能改进是什么?

    我正在编写一个具有多个分支的递归树搜索并且工作正常 为了加快速度 我正在实现一个简单的多线程 我将搜索分布到主分支中并将它们分散在线程中 每个线程不必与其他线程交互 当找到解决方案时 我将其添加到公共线程中std 向量以这种方式使用互斥体
  • Python super() 参数:为什么不是 super(obj)?

    我试图了解何时以及如何在 Python 中正确使用 super 2 7 x 或 3 x on gt gt gt help super 解释器告诉我如何称呼它 class super object super type gt unbound