「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python 3.x の Super() は引数なしでどのように動作するのでしょうか?また、潜在的な落とし穴は何ですか?

Python 3.x の Super() は引数なしでどのように動作するのでしょうか?また、潜在的な落とし穴は何ですか?

2024 年 11 月 7 日に公開
ブラウズ:872

 How Does Python 3.x\'s Super() Work Without Arguments, and What Are the Potential Pitfalls?

Python 3.x のスーパー マジック: 謎を解く

Python 3.x では、super() メソッドに驚くべき工夫が導入されました。引数なしで呼び出します。この一見無害な変更は、内部に重大な結果と固有の魔法をもたらします。

魔法の発見

DRY 原則を維持するために、新しい super() 動作は明示的なクラスをバイパスします。ネーミング。これには、元のクラス オブジェクトを取得する特別な class セルがあり、以前のスーパー アプローチを悩ませていた再バインドの落とし穴を回避します。

魔法の結果

残念ながら、この魔法には欠点があります。 super() 名を super_ などの別の変数に再バインドすると、その機能が中断される可能性があります。これは、セルがメソッド内で super または class が参照された場合にのみ作成されるために発生します。

実際的な落とし穴

この動作により、次のようなリスクが生じる可能性があります。疑いを持たないプログラマ:

  • super() を再バインドすると、予期しない例外が発生する可能性があります。
  • super(type(self), self) または super(self.__class__, self) に依存すると、結果が生じる可能性があります。派生クラスから呼び出された場合の無限再帰。
  • 新しいクラス オブジェクトを返すクラス デコレータは、super() へのクラス名のバインディングを無効にすることができます。

Beyond Super()

興味深いことに、リバインドの問題の影響を受ける Python エンティティは super() だけではありません。その他の例としては、PyPy の RPython の

  • this (super() の __class__ に似ています)
  • アンバインド メソッド オブジェクト経由でアクセスされるインスタンス メソッド (@ を破壊する可能性があります) が挙げられます。プロパティと @classmethod)
  • ドット表記なしで呼び出された場合の print、object、list などの組み込み

開発者への影響

] super() の魔法は便利ですが、注意が必要です。その複雑さを理解することは、実行時エラーを防ぐのに役立ちます。再バインドを使用する場合、プログラマは class を明示的に参照するか、代替の super() 呼び出しメソッドを利用することを検討する必要があります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3