Python __getattribute__ 和方法的包装

标签 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)

最佳答案

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

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

这里 fwrapper() 封闭,因此它可以在调用时访问名称。

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

相关文章:

python - 如何不计算单词之间的标点符号

python - 在Python中使用最后一次观察结果向前填充非na值

python - 在 Django 中解压缩 Zip 文件

桌面应用程序的 Webkit 包装器

围绕基本类型的 C++ 类包装器

javascript - 当我尝试计算密码字段时,以下代码有什么问题?

python - pip 或 easy_install 默认指的是哪个版本的 Python?

javascript - 为什么这不起作用?

java - 如何使用 Selenium Webdriver 和 Java 提取元素的显示属性

javascript - set/getAttribute 比较只适用于字符串?