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 函数和方法包括:
以上是在没有任何参数的情况下,'super()”如何在 Python 3.x 中发挥其魔力?的详细内容。更多信息请关注PHP中文网其他相关文章!