Python3 - 在 __eq__ 方法中使用 super() 会引发运行时错误:super(): __class__ cell not found

2023-11-25

我是猴子修补__eq__一个类的方法。我发现以下工作有效:

   def eq(obj, other):
       if isinstance(other, str):
          return obj.name.upper() == other.upper()
       else:
          return object.__eq__(obj, other)

这不起作用:

  def eq(obj, other):
     if isinstance(other, str):
         return obj.name.upper() == other.upper()
     else:
        return super().__eq__(other)

这有时有效,但有时会引发错误:

def eq(obj, other):
   if isinstance(other, str):
       return obj.name.upper() == other.upper()
   else:
       return super().__eq__(self, other)

错误:

<ipython-input-128-91287536205d> in eq(obj, other)
      3         return obj.name.upper() == other.upper()
      4     else:
----> 5         return super().__eq__(self, other)
      6 
      7 

RuntimeError: super(): __class__ cell not found

你能解释一下这是怎么回事吗?如何正确更换object with super()?


你不能使用super()在类外部定义的函数中不带参数。这__class__ cell super()只为 a 中定义的函数提供依赖class身体。来自super()文档:

零参数形式仅适用于类定义内部,因为编译器会填写必要的详细信息以正确检索正在定义的类,以及访问普通方法的当前实例。

使用 2 参数形式,显式命名类:

def eq(obj, other):
   if isinstance(other, str):
       return obj.name.upper() == other.upper()
   else:
       return super(ClassYouPutThisOn, obj).__eq__(other)

ClassYouPutThisOn.__eq__ = eq

这要求您在猴子补丁中显式命名该类,从而使其重用性降低。

相反,您可以提供所需的__class__ cell manually通过嵌套eq在另一个函数中__class__作为本地名称:

def patch_eq(cls):
    __class__ = cls  # provide closure cell for super()
    def eq(obj, other):
       if isinstance(other, str):
           return obj.name.upper() == other.upper()
       else:
           return super().__eq__(other)
    cls.__eq__ = eq

super()通过从调用框架中获取第一个本地名称(即传递到函数调用中的第一个参数,通常称为self).

另请参阅为什么 Python 3.x 的 super() 如此神奇?

使用嵌套函数方法的演示:

>>> class Foo:
...     name = 'bar'
...     def __eq__(self, other):
...         return False
...
>>> Foo() == 'Bar'
False
>>> Foo() == Foo()
False
>>> patch_eq(Foo)
>>> Foo() == 'Bar'
True
>>> Foo() == Foo()
False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3 - 在 __eq__ 方法中使用 super() 会引发运行时错误:super(): __class__ cell not found 的相关文章

随机推荐

  • 在 Spring Boot 中自动装配参数化构造函数

    我无法在参数化构造函数中传递值时自动装配 bean 如何使用Spring Boot调用参数化构造函数 Component public class MainClass public void someTask AnotherClass ob
  • pySerial - 有没有办法同时选择多个端口?

    我正在开发需要与许多串行端口通信的应用程序 我还没有找到一种方法来做到这一点而不使用每个端口的线程 有没有办法用单线程来做到这一点 比如同时在多个端口上选择或轮询 我正在使用 pyserial 2 6 我假设您在类 Unix 平台上使用 P
  • 对于无法将 Span 传递到 lambda 表达式的有效替代方案是什么?

    我有一个这种形状的函数 可以进行一维求根 public delegate double Fun double x object o public static void Solve Fun f out double y object o y
  • 使用 SpreadSheetGear 获取数据行数?

    我查了一些网上资源 也许我是瞎子 但我还无法找到答案 我正在上传一个文件 将其转换为流 然后将其输入 SpreadSheetGear 现在 我需要循环遍历每一行并读取数据 这很好 到目前为止 这是我的代码 IWorkbook wb Fact
  • 在图像上绘制文本

    我以前从未接触过绘画 所以遇到了一些问题 我似乎无法让这段代码的输出工作 文件正在保存 但未在文本上绘制 谁能看到我可能做错了什么 编辑 一个愚蠢的错误 图像的背景是白色的 画笔颜色是 然而 正如我所期望的那样 文本并未居中 有什么想法为什
  • 如何确定街景全景地图正在使用的视野

    我注意到每个街景缩放级别的视野 FOV 度在浏览器之间是不同的 我相信记录的街景视图缩放级别到 FOV 是 0 180 1 90 2 45 3 22 5 4 11 25 我正在使用带有街景全景图的 v3 地图 API 并在 chrome 中
  • 我的 LLVM 和 clang (OSX) 版本是什么?

    在 Mac OS 上 如果我运行clang version I get Apple LLVM version 6 0 clang 600 0 34 4 based on LLVM 3 5svn Target x86 64 apple dar
  • python中有内置的跨线程事件吗?

    python 中是否有任何内置语法允许我向问题中的特定 python 线程发布消息 就像 pyQt 中的 排队连接信号 或 Windows 中的 PostMessage 一样 我需要这个来实现程序部分之间的异步通信 有许多线程处理网络事件
  • 将 std::vector 项传递给可变参数函数

    我正在使用海湾合作委员会4 6 假设有一个参数向量 v 我必须传递给可变参数函数 f const char format 这样做的一种方法是 void VectorToVarArgs vector
  • JSON.stringify() 转 UTF-8

    据我所知 Javascript 从根本上使用 UTF 16 作为字符串标准 使用 JSON stringify 我可以从对象创建 JSON 字符串 该 JSON 字符串是 UTF 16 编码的吗 我可以将该字符串转换 希望能很快 为 UTF
  • R 更新后无法安装软件包:无法访问存储库索引:无法加载互联网例程

    我使用 RStudio 昨天我将 R 更新到以下版本 R version 4 0 0 2020 04 24 Arbor Day Copyright C 2020 The R Foundation for Statistical Comput
  • 无法构建PlusClient

    import com google android gms common ConnectionResult import com google android gms common GooglePlayServicesClient Conn
  • 如何向网络浏览器发送推送通知?

    过去几个小时我一直在阅读有关推送通知API and 网络通知API 我还发现 Google 和 Apple 分别通过 GCM 和 APNS 免费提供推送通知服务 我想了解我们是否可以使用桌面通知向浏览器实现推送通知 我相信这就是 Web 通
  • 如何检查列表是否包含空元素?

    假设我有一个空字符串 它将被分割 gt gt gt split 分裂的结果是 I use bool检查它是否为空 它会返回True gt gt gt bool True 如何检查分割结果是否为空 With bool 你正在检查列表是否 有任
  • Azure 应用程序注册时的 API 权限问题

    我在 Azure Active Directory gt 应用程序注册下注册了一个 API 应用程序 此 API 应用程序公开端点 组织内部的客户端将访问这些端点 客户端不是用户 而是将访问端点的后台服务 当我尝试向客户端授予访问 API
  • django select_for_update 和 select_lated 在同一查询上?

    有谁知道是否可以在单个查询中同时执行 select for update 和 select lated 语句 例如 employee get object or 404 Employee objects select for update
  • 如何使用 X509TrustManager 验证 android.net.http.SslCertificate?

    安卓的WebViewClient calls onReceivedSslError当它遇到不受信任的证书时 但是 那SslError我在该调用中收到的对象没有任何公共方式来访问底层X509Certificate根据现有的验证它TrustSt
  • 如何在数组中存储多种数据类型?

    我正在寻找类似数组的东西 但它需要存储多种数据类型 Oracle Java 教程说 数组是一个容器对象 它保存固定数量的单一类型的值 那么 如果我不能将一个数组用于多种类型 我该使用什么 我的这段代码一次只向地图添加一个标记 因为它会在每个
  • 带有字节数组的邮件附件

    我有一个名为 lSession 的 javax mail Session 和一个 MimeMessage lMessage Session lSession Session getDefaultInstance properties Mim
  • Python3 - 在 __eq__ 方法中使用 super() 会引发运行时错误:super(): __class__ cell not found

    我是猴子修补 eq 一个类的方法 我发现以下工作有效 def eq obj other if isinstance other str return obj name upper other upper else return object