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

这里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
于 2014-09-01T14:15:43.747 回答
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
于 2014-09-01T14:20:56.320 回答