ホームページ >バックエンド開発 >Python チュートリアル >同じ基礎となる関数を参照しているにもかかわらず、Python メソッドが等しくないのはなぜですか?
Python におけるメソッド参照の同等性
Python では、メソッドはアクセス時に動的に作成される固有のオブジェクトです。この動作は、いつ呼び出されるかに関係なく、同じオブジェクトによって参照される通常の関数の動作とは異なります。
これを理解するには、次の例を検討してください。
class What: def meth(self): pass What().meth is What().meth # False
このコードでは、同じ基礎となる関数を参照しているにもかかわらず、meth メソッドは等しくありません。これは、各メソッド オブジェクトが実行時に作成される一意のインスタンスであるためです。
この動作の理由は、記述子 (関数) の .__get__ メソッドを呼び出すことによってメソッド オブジェクトが生成される Python の属性検索プロセスにあります。
What.__dict__['meth'].__get__(What(), What)
このメソッド オブジェクトの動的作成により、次のことがわかります:
同じクラスのインスタンスには異なる meth オブジェクトがあります:
inst = What() inst.meth is inst.meth # False
異なるクラスのメソッドは常に異なるオブジェクトです:
What.meth is Other.meth # False
Python 3.8 より前では、テスト== を使用したメソッドの等価性により、一貫性のない結果が生じる可能性があります。ただし、Python 3.8 以降では、メソッドが完全に一致する場合、 .___self__ 属性と .___func__ 属性に基づいてメソッドを等価比較できます。
ベスト プラクティスとして、2 つのメソッドが同じ基になる関数を表すかどうかを判断するには、比較します。 .__func__ 属性:
What.meth.__func__ == What.meth.__func__ # True What().meth.__func__ == What().meth.__func__ # True (for same instance) What().meth.__func__ == What(other_instance).meth.__func__ # False (for different instances)
以上が同じ基礎となる関数を参照しているにもかかわらず、Python メソッドが等しくないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。