在派生类中调用 super() 时,可以传入 self.__class__ 吗? [复制]

2023-11-30

我最近发现(通过 StackOverflow),要调用基类中的方法,我应该调用:

super([[derived class]], self).[[base class method]]()

很好,它有效。但是,我发现自己在进行更改时经常在类之间复制和粘贴,并且经常忘记将派生类参数修复为 super() 函数。

我想避免必须记住更改派生类参数。我可以直接使用self.__class__作为 super() 函数的第一个参数?

它似乎有效,但我有充分的理由不应该这样做吗?


你不能。这super()call 需要知道该方法属于哪个类,以便在基类中搜索重写的方法。

如果你通过self.__class__(或者更好的是,type(self)) then super()被赋予wrong搜索方法的起点,最终会调用又是自己的方法.

将其视为形成方法解析顺序序列的类列表中的指针。如果你通过type(self)那么指针将指向任何子类而不是原始起点。

以下代码会导致无限递归错误:

class Base(object):
    def method(self):
        print 'original'

class Derived(Base):
    def method(self):
        print 'derived'
        super(type(self), self).method()

class Subclass(Derived):
    def method(self):
        print 'subclass of derived'
        super(Subclass, self).method()

Demo:

>>> Subclass().method()
subclass of derived
derived
derived
derived

<... *many* lines removed ...>

  File "<stdin>", line 4, in method
  File "<stdin>", line 4, in method
  File "<stdin>", line 4, in method
RuntimeError: maximum recursion depth exceeded while calling a Python object

because type(self) is Subclass, not Derived, in Derived.method().

在示例中,MROSubclass is [Subclass, Derived, Base], and super()需要知道从哪里开始搜索任何被重写的方法。通过使用type(self)你告诉它开始于Subclass,所以它会发现Derived.method()接下来,这就是我们开始的地方。

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

在派生类中调用 super() 时,可以传入 self.__class__ 吗? [复制] 的相关文章

随机推荐

  • doctrine2 和 group_concat

    我一直在浏览文档 谷歌 但没有找到任何解决方案 有没有办法在没有本机mysql的情况下使用doctrine2 DQL 执行或模仿GROUP CONCAT eg SELECT u id u name GROUP CONCAT AS user
  • 错误:您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展

    我是 WordPress 新手 上传网站后我遇到了这个错误 该网站运行良好一段时间 然后就发生了这种情况 输入 URL 后 此文本将显示 您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展 转到 php ini 但找不
  • 使用自定义成员资格和角色提供程序在 MVC 中实现 IPrincipal 和 IIdentity

    我一直坚持自定义 iprincpal 和 iidentity 对象的实现 我现在花了一天的时间来搜索如何实施这些权利并用更多信息来扩展它 我想扩展信息 Context User Identity Name使用全名或其他名称等自定义变量 ED
  • 使用“if”语句检查后出现空指针异常

    我遇到了一个非常烦人的错误 说我遇到了空指针异常 但有一个 if 语句来检查文本是否为空 然后再继续 public String getFileData throws IOException String file name C Users
  • 使用 Passport js failureRedirect 方法发回数据

    我有一个 Passport js 本地注册策略 它使用 successRedirect 和 failureRedirect 方法 问题是 如果注册过程出现错误 Passport 只会重定向回注册表单 表单中没有任何数据 app post s
  • 您可以通过其中的符号对齐文本吗?

    我想显示这样的电子邮件地址列表 email protected email protected email protected email protected email protected hinxterpexterp email pro
  • VBA在循环期间在数组中存储多列然后返回值

    我有一个宏 它将用户定义的函数 代码中的 R ajseasonX13 应用于工作表 NSA 中的多个列 然后返回工作表 SA 中的值 问题是我的代码一次仅将该函数应用于一个列 一旦 VBA 不断在选项卡 NSA 和 SA 之间来回移动 结果
  • 如何在 Spring config.xml 中配置 Cron 时区?

    我有一个带有 Cron 任务的 Spring 配置 xml 文件 该任务在我的机器上定期执行 如何在 xml 文件中配置此任务以使用莫斯科时区 与我的时区不同
  • 更改浏览器缩放级别

    我需要在我的网站上创建 2 个按钮来更改浏览器缩放级别 由于图像大小和布局问题 我请求浏览器缩放而不是 css 缩放 嗯 这可能吗 我听到了相互矛盾的报道 尽管在 Firefox 中不起作用 但在 IE 和 chrome 中可以使用 img
  • sci-kit learn:使用 X.reshape(-1, 1) 重塑数据

    我正在训练一个用于文本分类的 python 2 7 11 分类器 在运行时我收到一条已弃用的警告消息 表明我不知道代码中的哪一行导致了它 错误 警告 但是 代码运行良好并给了我结果 AppData Local Enthought Canop
  • Haskell Esqueleto 将列子集投影到自定义记录列表

    在所有的例子中我都看到了结果埃斯克莱托被投影到元组列表中或实体记录 例如 previousLogItems lt select from li gt do orderBy desc li LogItemId limit 10 return
  • 在我的 iOS 应用程序中使用 IOKit 会导致我的应用程序被拒绝吗?

    开发人员 正如提到的EricaIOKit是一个半私有框架 有人有在应用程序商店应用程序中使用它的经验吗 我想用它来获取 IMEI 和 ICCID 号码 如果您调用任何未记录的 Apple 框架 您的应用程序将被拒绝 因此 人们不太可能有在应
  • 如何处理 IE 8 中缺少 JavaScript Object.bind() 方法

    我正在编写一些 JavaScript 它使用Object bind method funcabc function x y z this myx x this playUB function w if this myx null do bl
  • 有谁知道协议缓冲区的 Ada 插件吗?

    我正在寻找用于协议缓冲区的 Ada 插件 看起来除了 Ada 之外 几乎所有语言插件都可用或正在开发中 嗯 我唯一发现的是这篇论文 不幸的是 我没有找到任何翻译工具的源代码 即你所说的plugin 我唯一能告诉的是该工具是用 C 开发的 U
  • 将向量的向量打印到 ostream

    请考虑以下代码 我正在尝试将向量的向量输出到 ostream include
  • 如何从任何字符串网址获取网站名称[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我已经给出了包含任何有效 url 的字符串 我必须从给定的网址中找到网站的名称 我也忽略了子域 like http www yahoo com gt yahoo www google
  • 向多个图层组添加标记

    我使用 StyledLayerControl 和 markcluster 使用 leafletjs 创建了一张地图 https www wiva at v2 basemap kartentest 每个标记代表一个适合一个类别 图层组 的研究
  • 根据身体负荷向下滑动一个 div

    如何让 div 在页面加载时隐藏 然后在页面加载后向下滑动 我不想使用 CSSdisplay none 尝试一下这个小提琴 http jsfiddle net ahr3U 这基本上使用 CSS3 设置过渡的所有参数 过渡属性使动画成为可能
  • jshn - 如何解析 json 包

    我想知道如何在openwrt上轻松解析json 我有 jhsn 来解析 json 这是我的程序 sh 脚本 download weather wget api openweathermap org data 2 5 weather id 2
  • 在派生类中调用 super() 时,可以传入 self.__class__ 吗? [复制]

    这个问题在这里已经有答案了 我最近发现 通过 StackOverflow 要调用基类中的方法 我应该调用 super derived class self base class method 很好 它有效 但是 我发现自己在进行更改时经常在