【问题标题】:Python __getattribute__ and wrapper of methodPython __getattribute__ 和方法包装器
【发布时间】:2014-09-01 14:08:47
【问题描述】:

我想在调用特定方法之前调用函数的包装方法。 所以我想我必须重写__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)

【问题讨论】:

  • 你的意思是把括号放在下面return wrapper(super(A, self).__getattribute__)(name)吗?
  • @DavidRobinson:不,这实际上并没有检索方法对象。看看我的答案,我将super() 调用和包装分开。

标签: python wrapper getattribute


【解决方案1】:

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

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

【讨论】:

  • Ty 寻求帮助。我不能改变或影响wrapper(来自另一个班级)。但我想我唯一的选择是在test 方法上做一个装饰器,我不需要使用__getattribute__.
  • @Katsu:是的,那将是更好的选择。我认为这不是你的选择。
【解决方案2】:

如果我理解正确,您可以使用装饰器。

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

【讨论】:

  • +1:是的,我建议之前的评论谢谢
猜你喜欢
  • 2013-01-19
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多