Python 3.x の「super()」はなぜこの「魔法」のような動作をするのでしょうか?また、どのような場合にエラーが発生するのでしょうか?

Barbara Streisand
リリース: 2024-10-26 12:18:29
オリジナル
556 人が閲覧しました

  Why Does Python 3.x's `super()` Have This

Python 3.x の super() が魔法を実行できる理由

Python 3.x では、super() 関数は何もしなくても呼び出すことができます。引数。これにより、以下に示すように、スーパークラスの呼び出しが簡略化され、改善されました。

<code class="python">class A(object):
    def x(self):
         print("Hey now")

class B(A):
    def x(self):
        super().x()

B().x()  # Outputs: "Hey now"</code>
ログイン後にコピー

この機能は、コンパイル時のマジックによって実現され、実行時に super() が正しいスーパークラスにアクセスできるようになります。ただし、この動作は、次に示すように、super() が別の名前に再バインドされるときに予期しないエラーを引き起こす可能性があります。

<code class="python">super_ = super

class A(object):
    def x(self):
        print("No flipping")

class B(A):
    def x(self):
        super_().x()

B().x()  # Raises: RuntimeError: super(): __class__ cell not found</code>
ログイン後にコピー

super() の内部動作の公開

super() の背後にある魔法は、メソッド内で super または class が参照されるときに作成されるコンパイル時の class セルにあります。このセルは、クラス名が再バインドされている場合でも、super() に元のクラス オブジェクトへのアクセスを提供します。

この class セル メカニズムは、クラスの明示的な名前付けによって発生するエラーを防ぐために導入されました。 super() を呼び出すとき、または新しいクラス オブジェクトを返すクラス デコレータを使用するとき。また、無限再帰につながる可能性のある super(type(self), self) や super(self.__class__, self) を使用した呼び出しなど、super() の誤用も回避します。

実用的アプリケーションと注意事項

class セルは利便性を高めますが、特定のシナリオでは予期しない動作を引き起こす可能性もあります。たとえば、super() が別の名前 (たとえば、前に示した super_) に再バインドされ、メソッドが class を明示的に参照しない場合、super() 呼び出しは失敗します。

基礎となるメカニズムについて知っておくと有益となるもう 1 つの例は、クラス デコレータを使用する場合です。デコレーターが新しいクラス オブジェクトを返した場合、class セルは元のクラスを参照し続け、正しいスーパークラス呼び出しが保証されます。

他の関数、メソッド、またはPython のクラスも予期しない動作を引き起こす可能性があります。ただし、 super() は、オブジェクト指向プログラミングにおける中心的な役割を担うため、特に注目に値する例です。

以上がPython 3.x の「super()」はなぜこの「魔法」のような動作をするのでしょうか?また、どのような場合にエラーが発生するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!