メソッドでの演算子 'is' の非常に奇妙な動作 質問する

メソッドでの演算子 'is' の非常に奇妙な動作 質問する

なぜ最初の結果になるFalseのでしょうかTrue?

>>> from collections import OrderedDict
>>> OrderedDict.__repr__ is OrderedDict.__repr__
False
>>> dict.__repr__ is dict.__repr__
True

ベストアンサー1

ユーザー定義関数の場合、Python 2では縛られないそしてバウンド方法は、記述子プロトコル; はOrderedDict.__repr__そのようなメソッドオブジェクトであり、ラップされた関数は次のように実装されている。純粋なPython関数

記述子プロトコルは、__get__方法それをサポートするオブジェクトでは、__repr__.__get__()アクセスしようとするたびに呼び出されますOrderedDict.__repr__。クラスNone(インスタンスなし)の場合は、クラスオブジェクト自体が渡されます。新しい関数メソッドが呼び出されるたびにメソッド オブジェクト__get__が呼び出されますが、isこれは失敗します。同じメソッド オブジェクトではありません。

dict.__repr__はカスタムPython関数ではなくC関数であり、その__get__記述子メソッドself基本的にはクラスにアクセスしたときに返されるだけです属性にアクセスすると毎回同じオブジェクトが返されるので、次のようにis動作します。

>>> dict.__repr__.__get__(None, dict) is dict.__repr__  # None means no instance
True

メソッドには__func__ラップされた関数を参照する属性があり、それを使用して ID をテストします。

>>> OrderedDict.__repr__
<unbound method OrderedDict.__repr__>
>>> OrderedDict.__repr__.__func__
<function __repr__ at 0x102c2f1b8>
>>> OrderedDict.__repr__.__func__.__get__(None, OrderedDict)
<unbound method OrderedDict.__repr__>
>>> OrderedDict.__repr__.__func__ is OrderedDict.__repr__.__func__
True

Python 3では、縛られないメソッドはfunction.__get__(None, classobj)関数オブジェクト自体を返します(つまり、dict.__repr__のように動作します)。しかし、バウンドメソッド、インスタンスから取得されるメソッド。

おすすめ記事