super() の再バインドがコードを壊す可能性がある理由
Python 3.x では、アクセスするための引数なしで super() 関数を呼び出すことができます。スーパークラスのメソッド。この動作は、super() と呼び出しクラス間の接続を確立するコンパイル時のマジック トリックによって有効になります。ただし、スーパー名が別の変数 (この例では super_) に再バインドされると、この接続は切断されます。
この理由は D.R.Y. です。 (同じことを繰り返さない) 原則。スーパークラスの呼び出しで呼び出しクラスに明示的に名前を付けると、この原則に違反し、再バインドの問題が発生するリスクが高まります。さらに、クラス名を変更するクラス デコレータを使用すると、元のクラス オブジェクトへの参照も中断されます。
super() を含む関数の周囲のクロージャ内に非表示の class セルを作成すると、 super() の魔法の実装により、これらの問題が回避されます。セルは元のクラス オブジェクトを参照し、スーパー名が再バインドされた場合でも、super() が常に正しいスーパークラスにアクセスできるようにします。
この動作は意外に思えるかもしれませんが、super() は悪用されることが多い。呼び出し構文を簡素化し、無限再帰の落とし穴を回避することで、更新された実装はエラーの防止に役立ちます。
スーパーがリバウンドした場合、メソッド内で クラス を参照すると機能が復元されます。これは、メソッド内で super または class が使用されるときにセルが作成されるためです。
以上が`super()` を再バインドすると Python コードが壊れるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。