Python のメソッドには参照の等価性がないのはなぜですか?

DDD
リリース: 2024-10-27 15:53:02
オリジナル
392 人が閲覧しました

 Why Do Methods in Python Lack Reference Equality?

Python におけるメソッド参照の等価性: 謎を解く

通常の関数からの継承が与えられているように見えるメソッドに、参照という美徳が欠けているのはなぜですか平等?この不可解な現象は、多くの Python プログラマーを困惑させてきました。この違いの背後にある理由を理解するために、基礎となるメカニズムを詳しく調べてみましょう。

プログラム全体でオブジェクトのアイデンティティを保持する通常の関数とは異なり、メソッド オブジェクトはアクセス時に動的に作成されます。この一時的な性質は、 .__get__ メソッドが呼び出されたときにメソッド オブジェクトを生成する記述子への依存関係に由来します。コード スニペットは、この動作を適切に示しています。

<code class="python">>>> What.__dict__['meth']
<function What.meth at 0x10a6f9c80>
>>> What.__dict__['meth'].__get__(What(), What)
<bound method What.meth of <__main__.What object at 0x10a6f7b10>></code>
ログイン後にコピー

Python 3.8 以降、メソッドの等価性テストは一貫性があり、予測可能になりました。 2 つのメソッドは、.__self__ (バインド先のインスタンス) 属性と .__func__ (基になる関数) 属性の両方が同一のオブジェクトである場合、等しいとみなされます。

ただし、この一貫した動作は最近追加されたものです。 Python 3.8 より前では、メソッドの同等性は実装の詳細に応じて異なりました。 Python メソッドと特定の C メソッド タイプについては、self が等しいかどうか比較され、他の C メソッド タイプについては self が同一性によって比較されました。この不一致は、最終的に Python 問題 1617161 で解決されました。

一貫性を確保するには、func 属性を使用してメソッドのアイデンティティを検証することをお勧めします。

<code class="python">>>> What.meth == What.meth     # functions (or unbound methods in Python 2)
True
>>> What().meth == What.meth   # bound method and function
False
>>> What().meth == What().meth # bound methods with *different* instances
False
>>> What().meth.__func__ == What().meth.__func__ # functions
True</code>
ログイン後にコピー

要約すると、次のようになります。メソッド オブジェクトの一時性と、メソッドの等価性の歴史的矛盾が相まって、メソッドの参照の等価性が欠如しています。ただし、Python 3.8 では、より一貫性があり予測可能なアプローチが導入されており、プログラマーはメソッドの同等性についてより自信を持って推論できるようになります。

以上がPython のメソッドには参照の等価性がないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!