”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Python 3.x 的 Super() 在没有参数的情况下如何工作?潜在的陷阱是什么?

Python 3.x 的 Super() 在没有参数的情况下如何工作?潜在的陷阱是什么?

发布于2024-11-07
浏览:870

 How Does Python 3.x\'s Super() Work Without Arguments, and What Are the Potential Pitfalls?

Python 3.x 的超级魔法:解开谜团

Python 3.x 在其 super() 方法中引入了令人惊讶的转折,允许无参数调用。这种看似无害的变化在幕后却带来了重大的后果和内在的魔力。

揭开魔力

为了维护 DRY 原则,新的 super() 行为绕过了显式类命名。它有一个特殊的 class 单元,用于检索原始类对象,避免了困扰之前超级方法的重新绑定的陷阱。

Magic 的后果

不幸的是,这个魔法有一个缺点。将 super() 名称重新绑定到不同的变量(例如 super_)可能会破坏其功能。发生这种情况的原因是,仅当在方法中引用 super 或 class 时才会创建单元格。

实际陷阱

此行为可能会带来风险毫无戒心的程序员:

  • 重新绑定 super() 可能会导致意外的异常。
  • 依赖 super(type(self), self) 或 super(self.__class__, self) 可能会导致从派生类调用时处于无限递归中。
  • 返回新类对象的类装饰器可以使绑定到 super() 的类名无效。

超越 Super()

有趣的是,super() 并不是唯一受重新绑定问题影响的 Pythonic 实体。其他示例包括:

  • PyPy 的 RPython 中的 this(类似于 super() 的 __class__)
  • 通过未绑定方法对象访问的实例方法(可能会破坏 @ property 和 @classmethod)
  • 在没有点符号的情况下调用时内置的 print、object 和 list

对开发人员的影响

虽然 super() 的魔力很有用,但仍需谨慎。了解其复杂性有助于防止运行时错误。使用重新绑定时,程序员应考虑显式引用 class 或利用替代的 super() 调用方法。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3