ホームページ >バックエンド開発 >Python チュートリアル >同じ基礎となる関数を参照しているにもかかわらず、Python メソッドが等しくないのはなぜですか?

同じ基礎となる関数を参照しているにもかかわらず、Python メソッドが等しくないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 04:59:29934ブラウズ

 Why are Python Methods Not Equal, Even if They Refer to the Same Underlying Function?

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

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