我想调用函数的包装器方法,只需 之前我调用特定方法。
所以我想我必须超越__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)
问题是当test
返回值时调用getattribute。我想要的是能够用参数捕获test
并定义这样的包装器方法:
def wrapper(func, *args, **kwargs):
print "do some stuff"
return func(*args, **kwargs)
答案 0 :(得分: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
答案 1 :(得分: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