ホームページ  >  記事  >  バックエンド開発  >  `super()` を再バインドすると Python コードが壊れるのはなぜですか?

`super()` を再バインドすると Python コードが壊れるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 11:08:30853ブラウズ

 Why Does Rebinding `super()` Break Your Python Code?

super() の再バインドがコードを壊す可能性がある理由

Python 3.x では、アクセスするための引数なしで super() 関数を呼び出すことができます。スーパークラスのメソッド。この動作は、super() と呼び出しクラス間の接続を確立するコンパイル時のマジック トリックによって有効になります。ただし、スーパー名が別の変数 (この例では super_) に再バインドされると、この接続は切断されます。

この理由は D.R.Y. です。 (同じことを繰り返さない) 原則。スーパークラスの呼び出しで呼び出しクラスに明示的に名前を付けると、この原則に違反し、再バインドの問題が発生するリスクが高まります。さらに、クラス名を変更するクラス デコレータを使用すると、元のクラス オブジェクトへの参照も中断されます。

super() を含む関数の周囲のクロージャ内に非表示の class セルを作成すると、 super() の魔法の実装により、これらの問題が回避されます。セルは元のクラス オブジェクトを参照し、スーパー名が再バインドされた場合でも、super() が常に正しいスーパークラスにアクセスできるようにします。

この動作は意外に思えるかもしれませんが、super() は悪用されることが多い。呼び出し構文を簡素化し、無限再帰の落とし穴を回避することで、更新された実装はエラーの防止に役立ちます。

スーパーがリバウンドした場合、メソッド内で クラス を参照すると機能が復元されます。これは、メソッド内で super または class が使用されるときにセルが作成されるためです。

以上が`super()` を再バインドすると Python コードが壊れるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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