2017-01-03 5 views
4

私は、特定のクラスインスタンスのメソッドを指す変数を持っています。 メソッドgetを実装するClientというクラスがあります。 にはclientという単一インスタンスが作成され、クライアントのgetには変数get_funcが割り当てられます。Pythonインスタンスメソッドがクラスによって提供されたものと同じ関数であるかどうかをテストします。

例えば、私は以下の単純化されたコードを持っていると仮定することができます:

class Client: 
    def get(self): 
     print("This is the get function!") 

client = Client() 
get_func = client.get 

私はget_funcをほとんど実際の制御を持っており、それが使われているか、私はそれを変更することはできません。

ここでget_funcClient.getが含まれていることを確認します。

get_funcは、特定のClientインスタンスのバインドされたメソッドであるため、簡単なテストget_func == Client.getは機能しません。 (唯一の私はそれを行う方法を知っていたならば、しかし限定法のselfを取得する方法は有効なオプションです)

+3

'get_func .__ func__ is Client.get'を試してください。 – vaultah

答えて

4

Client.get機能オブジェクト(Pythonの3のどちらかである私は、直接clientインスタンスを取得することはできません)、またはバインドされていないメソッド(Python 2)。他方、Client().getは、結合方法である。メソッドは、関数オブジェクトの周りのラッパーで、束縛されているインスタンス(インスタンスがある場合)を引数selfとして渡して記録します。 Pythonが関数からメソッドを生成する方法については、Python descriptor How-toを参照してください。

あなたは __func__属性で、彼らはラップという基本関数オブジェクトを取得し、それをテストするためにバインドされた方法と結合していない方法の両方をアンラップすることができ

get_func.__func__ is Client.get # Python 3 
get_func.__func__ is Client.get.__func__ # Python 2, unwrap the unbound method 

あなたとあなたのコード互換性を持たせる必要がある場合

def unwrap_method(f): 
    return getattr(f, '__func__', f) 

と使用::

あなたは、単純なヘルパー関数を作成することができますPythonの2 3、両方210
unwrap_method(get_func) is unwrap_method(Client.get) 
関連する問題