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