2016-05-02 14 views
0

バインドされたメソッドが何らかの方法で渡されるPython 3プログラムを考えてみましょう。どのようにして、メソッドをクラス定義でそれらを定義する元の関数と比較しますか? OOP用語で表現されています:バインドされたメソッドが関数のインスタンスであるかどうかをチェックする方法関数をPythonのバインドされたメソッドと比較する3

は、いくつかのREPL-INGとexamplifyます:私は上記の達成したいことはo.mが何らかの方法でC.mに関連しているかどうかを確認することができることです

>>> class C(object): 
... def m(self): 
...  print("Calling m") 
... 
>>> o = C() 
>>> print(o.m) 
<bound method C.m of <__main__.C object at 0xb6f56d6c>> 
>>> print(C.m) 
<function C.m at 0xb6f4c6a4> 
>>> if o.m == C.m: 
... print("Equality") 
... 
>>> if isinstance(o.m, C.m): 
... print("Relation") 
... 
Traceback ... 

もちろん、C.mとo.mの文字列表現を取ることができます。正規表現はC.mを読み取る部分を切り取り、o.mはC.mに関連する結果に終わります。しかし、この問題に対処するにはより良い方法が必要です。

答えて

0

それぞれのメソッドは元の関数を保持するフィールドが__func__であることがわかります。 Pythonの2で

>>> C.m == o.m.__func__ 
True 

が、それはim_func属性です:2つの方法が同じ基本関数オブジェクトを持っている場合

if o.m.__func__ == C.m: 
     print("Equality") 
1

を使用し、__func__属性を表示するには:他の言葉では比較がのように記述することができます。

この属性については、documentationで説明しています。

関連する問題