首页  >  文章  >  后端开发  >  在没有任何参数的情况下,“super()”如何在 Python 3.x 中发挥其魔力?

在没有任何参数的情况下,“super()”如何在 Python 3.x 中发挥其魔力?

Patricia Arquette
Patricia Arquette原创
2024-10-27 02:12:30216浏览

 How Does `super()` Work Its Magic in Python 3.x Without Any Arguments?

Python 3.x 中的 Super() 魔法

在 Python 3.x 中,super() 函数拥有一个独特的能力:可以在没有任何参数的情况下调用。这种行为虽然一开始令人惊讶,但却源于为解决常见编程陷阱而特意设计的选择。

避免 DRY 违规和类名歧义

Python 3 之前的版本.x 中,调用 super() 时需要对类进行显式命名,如下代码片段所示:

<code class="python">class Foo(Bar):
    def baz(self):
        return super(Foo, self).baz() + 42</code>

但是,这种做法违反了 DRY 原则,容易受到以下原因导致的类名歧义:全局重新绑定或类装饰器。为了缓解这些问题,Python 3.x 引入了 super() 的神奇实现。

利用 Class 单元进行运行时解析

The super() 的当前实现使用 class 单元。该单元提供对原始类对象的访问,使 super() 能够在运行时解析超类,而无需显式类命名。因此,即使重新分配 Foo,以下代码也能按预期工作:

<code class="python">class Foo(Bar):
    def baz(self):
        return super().baz() + 42

Spam = Foo
Foo = something_else()

Spam().baz()  # still works</code>

妥协和实现细节

最初, super() 被提议为一个关键字,但由于担心它被认为“太神奇”,导致了当前的实施。 Guido van Rossum 本人认识到对 super() 使用不同名称可能会产生歧义。

潜在缺点

虽然 super() 的神奇行为通常是有益的,如果动态修改超类或重命名 super(),可能会导致意外结果。在这种情况下,建议在方法中显式引用 class 变量以确保正确的功能。

受重命名影响的函数的替代示例

其他可能受重命名影响的 Python 函数和方法包括:

  • type()
  • isinstance()
  • issubclass()
  • property()
  • classmethod()
  • staticmethod()

以上是在没有任何参数的情况下,“super()”如何在 Python 3.x 中发挥其魔力?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn