謎の解明: Python におけるメソッド参照の等価性
Python プログラミングの領域では、参照の等価性の概念は魅力的であり、また魅力的でもあります。困惑する。驚くべきことに、メソッドは通常の関数とは異なり、参照の等価性に関して独特の動作を示します。
なぜこの顕著な違いがあるのでしょうか?答えは、メソッドの作成方法と呼び出し方法の性質にあります。グローバル スコープ内に独立して存在する関数とは異なり、メソッドはアクセスされるたびに動的に生成されます。これは、Python における記述子としての関数の役割に由来します。関数の .__get__ メソッドが呼び出されると、メソッド オブジェクトが返されます。
次の例を考えてみましょう。
<code class="python">class What: def meth(self): pass print(What.meth is What.meth) # This is False in Python 2 print(inst.meth is inst.meth) # False</code>
上記のコードは、両方のシナリオで False を出力します。これは、What.meth にアクセスするたびに、新しいメソッド オブジェクトが作成されるためです。したがって、これらのメソッド オブジェクトは参照が等しいとは見なされません。
対照的に、通常の関数はグローバル エンティティであるため、func が呼び出されるときは、常に同じオブジェクトを参照します。これは、func の True の結果が func であることを説明しています。
ただし、Python 3.8 では大幅な改善が加えられています。現在、2 つのメソッドの .__self__ 属性と .__func__ 属性が同一のオブジェクトである場合、同等であるとみなされます。これは、2 つのメソッドが同じ関数をラップし、同じインスタンスにバインドされている場合、== を使用して True を比較することを意味します。
3.8 より前の Python バージョンでは、method == の動作に一貫性がありませんでした。 Python メソッドと 1 つのタイプの C メソッドは self の同等性を比較し、別のタイプの C メソッドは self を同一性で比較しました。
2 つのメソッドが同じを表すかどうかをテストします。基礎となる関数の func 属性を比較することをお勧めします:
<code class="python">print(What.meth == What.meth) # functions (or unbound methods in Python 2) print(What().meth == What().meth) # bound methods with *different* instances print(What().meth.__func__ == What().meth.__func__) # functions</code>
以上が参照の等価性において Python メソッドの動作が関数と異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。