Python __getattribute__ и оболочка метода

Я хочу вызвать метод-обертку функции с аргументом непосредственно перед вызовом конкретного метода. Так что я думаю, что я должен переписать __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)

2 ответа

Решение

Используйте фабричную функцию, чтобы вернуть вашу оболочку:

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

Вот f закрыто 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

Если я вас правильно понимаю, вы можете использовать декоратор.

def wrapper(func):
    def _wrapper(*args, **kwargs):
        return func(*args, **kwargs) * 2

    return _wrapper

class A(object):
    @wrapper
    def test(self, arg):
        return arg + 1
Другие вопросы по тегам