我想在调用特定方法之前调用带有参数的函数的包装方法。
所以我想我必须重写 __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)
最佳答案
使用工厂函数返回您的包装器:
def decorate(f):
def wrapper(*args, **kw):
return f(*args, **kw) * 2
return wrapper
这里 f
被 wrapper()
封闭,因此它可以在调用时访问名称。
然后在__getattribute__
钩子(Hook)中返回它:
def __getattribute__(self, name):
result = super(A, self).__getattribute__(name)
if name in ('test',):
return decorate(result)
return result
当然,您也可以在 test
上应用 decorate
作为装饰器,然后:
class A(object):
@decorate
def test(self, arg):
return arg + 1
关于Python __getattribute__ 和方法的包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607639/