ホームページ バックエンド開発 Python チュートリアル Python のメソッドには参照の等価性がないのはなぜですか?

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

Oct 27, 2024 pm 03:53 PM

 Why Do Methods in Python Lack Reference Equality?

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

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

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

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

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

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

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

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

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

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

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLを解析するために美しいスープを使用するにはどうすればよいですか? HTMLを解析するために美しいスープを使用するにはどうすればよいですか? Mar 10, 2025 pm 06:54 PM

HTMLを解析するために美しいスープを使用するにはどうすればよいですか?

Pythonでの画像フィルタリング Pythonでの画像フィルタリング Mar 03, 2025 am 09:44 AM

Pythonでの画像フィルタリング

Pythonを使用してテキストファイルのZIPF配布を見つける方法 Pythonを使用してテキストファイルのZIPF配布を見つける方法 Mar 05, 2025 am 09:58 AM

Pythonを使用してテキストファイルのZIPF配布を見つける方法

Pythonを使用してPDFドキュメントの操作方法 Pythonを使用してPDFドキュメントの操作方法 Mar 02, 2025 am 09:54 AM

Pythonを使用してPDFドキュメントの操作方法

DjangoアプリケーションでRedisを使用してキャッシュする方法 DjangoアプリケーションでRedisを使用してキャッシュする方法 Mar 02, 2025 am 10:10 AM

DjangoアプリケーションでRedisを使用してキャッシュする方法

TensorflowまたはPytorchで深い学習を実行する方法は? TensorflowまたはPytorchで深い学習を実行する方法は? Mar 10, 2025 pm 06:52 PM

TensorflowまたはPytorchで深い学習を実行する方法は?

Pythonオブジェクトのシリアル化と脱介入:パート1 Pythonオブジェクトのシリアル化と脱介入:パート1 Mar 08, 2025 am 09:39 AM

Pythonオブジェクトのシリアル化と脱介入:パート1

Pythonで独自のデータ構造を実装する方法 Pythonで独自のデータ構造を実装する方法 Mar 03, 2025 am 09:28 AM

Pythonで独自のデータ構造を実装する方法

See all articles