なぜ最初の結果になる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__
のように動作します)。しかし、バウンドメソッド、インスタンスから取得されるメソッド。