ホームページ  >  記事  >  バックエンド開発  >  参照の等価性において Python メソッドの動作が関数と異なるのはなぜですか?

参照の等価性において Python メソッドの動作が関数と異なるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-30 07:32:02436ブラウズ

 Why Do Python Methods Behave Differently in Reference Equality Compared to Functions?

謎の解明: 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 サイトの他の関連記事を参照してください。

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