Python __getattribute__和方法的包装器

时间:2014-09-01 14:08:48

标签: python wrapper 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)

问题是当test返回值时调用getattribute。我想要的是能够用参数捕获test并定义这样的包装器方法:

def wrapper(func, *args, **kwargs):
    print "do some stuff"
    return func(*args, **kwargs)

2 个答案:

答案 0 :(得分:2)

使用工厂函数返回包装器:

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

此处fwrapper()关闭,因此可以在调用时访问该名称。

然后在__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