ホームページ  >  記事  >  バックエンド開発  >  Python 3.x では引数なしで「super()」がどのように魔法のように機能するのでしょうか?

Python 3.x では引数なしで「super()」がどのように魔法のように機能するのでしょうか?

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() の魔法の実装が導入されました。

実行時解決のために クラス セルを利用する

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()
  • プロパティ()
  • クラスメソッド()
  • 静的メソッド()

以上がPython 3.x では引数なしで「super()」がどのように魔法のように機能するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。