2

特定のメソッドを呼び出す直前に引数付き関数のラッパーメソッドを呼び出したい。したがって、メソッドを上書きする必要があると思い__getattribute__ます。

コードの例を次に示します。

def wrapper(func):
    return func * 2

class A(object):
    def test(self, arg):
        return arg + 1

    def __getattribute__(self, name):
        if name in ['test']:
            return wrapper(super(A, self).__getattribute__(name))
        return super(A, self).__getattribute__(name)

問題は、値を返すときに getattribute が呼び出されるtestことです。私が欲しいのはtest、引数でキャッチして、次のようにラッパーメソッドを定義できるようにすることです:

def wrapper(func, *args, **kwargs):
    print "do some stuff"
    return func(*args, **kwargs)
4

2 に答える 2

4

ファクトリ関数を使用してラッパーを返します。

def decorate(f):
    def wrapper(*args, **kw):
        return f(*args, **kw) * 2
    return wrapper

Herefは によって閉じられてwrapper()いるため、呼び出されたときに名前にアクセスできます。

次に、これを__getattribute__フックに返します。

def __getattribute__(self, name):
    result = super(A, self).__getattribute__(name)
    if name in ('test',):
        return decorate(result)
    return result

もちろん、次decorateのデコレータとして適用することもできますtest

class A(object):
    @decorate
    def test(self, arg):
        return arg + 1
于 2014-09-01T14:15:43.747 に答える