44

メソッドへの参照が与えられた場合、メソッドがオブジェクトにバインドされているかどうかを確認する方法はありますか?バインドされているインスタンスにもアクセスできますか?

4

5 に答える 5

45
def isbound(method):
    return method.im_self is not None

def instance(bounded_method):
    return bounded_method.im_self

ユーザー定義メソッド:

クラスからユーザー定義関数オブジェクトを取得することによってユーザー定義メソッド オブジェクトが作成される場合、その im_self属性はNoneであり、メソッド オブジェクトはバインドされていないと言われます。インスタンスの1つを介してクラスからユーザー定義関数オブジェクトを取得することによって作成される場合、その im_self属性はインスタンスであり、メソッドオブジェクトはバインドされていると言われます。いずれの場合も、新しいメソッドの im_class属性は取得元のクラスであり、そのim_func属性は元の関数オブジェクトです。

Python 2.6 および 3.0 の場合:

インスタンス メソッド オブジェクトには、メソッドを構成するオブジェクトと関数の新しい属性があります。の新しいシノニムim_self__self__であり、im_func としても利用できます__func__。古い名前は Python 2.6 でもサポートされていますが、3.0 ではなくなりました。

于 2008-09-10T02:19:09.050 に答える
25

Python 3 では、__self__属性はバインドされたメソッドでのみ設定されます。Noneプレーンな関数 (または python 3 の単なるプレーンな関数であるバインドされていないメソッド) には設定されていません。

次のようなものを使用します。

def is_bound(m):
    return hasattr(m, '__self__')
于 2013-09-23T09:03:57.013 に答える
11

選択した答えは、ほとんどすべての場合に有効です。ただし、選択した回答を使用してメソッドがデコレーターにバインドされているかどうかを確認すると、チェックは失敗します。次のデコレーターとメソッドの例を考えてみましょう。

def my_decorator(*decorator_args, **decorator_kwargs):
    def decorate(f):
        print(hasattr(f, '__self__'))
        @wraps(f)
        def wrap(*args, **kwargs):
            return f(*args, **kwargs)
        return wrap
    return decorate

class test_class(object):
    @my_decorator()
    def test_method(self, *some_params):
        pass

printデコレータのステートメントが出力されますFalse。この場合、引数名を使用して関数パラメーターをチェックし、 という名前のパラメーターを探す以外に方法が見つかりませんself。メソッドの最初の引数には名前を付ける必要がなく、他の名前を付けることができるため、これも問題なく動作するとは限りません。self

import inspect

def is_bounded(function):
    params = inspect.signature(function).parameters
    return params.get('self', None) is not None
于 2018-04-28T08:39:51.880 に答える
4

im_self属性(Python 2 のみ)

于 2008-09-10T00:42:13.167 に答える