使用类作为另一个类方法的装饰器

杰基

我在使用一个类来装饰另一个类的方法时遇到问题。代码如下

class decorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args):
        return self.func(*args)

class test(object):
    @decorator
    def func(self, x, y):
        print x, y

t = test()
t.func(1, 2)

它显示这个错误

类型错误:func() 正好接受 3 个参数(给出 2 个)。

如果调用使用

t.func(t, 1, 2)

然后它通过。但是如果装饰器被带走,那么这条线将再次出现问题。

为什么会发生这种情况以及如何解决?

编辑:在装饰器中显示自我的代码的第二个版本。call应该与 test.func 中的 self 不同

class decorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args):
        return self.func(*args)

class test(object):
    def __init__(self):
        self.x = 1
        self.y = 2
    @decorator
    def func(self):
        print self
        print self.x, self.y

t = test()
t.func()

这显示了相同的错误。

t.func(t)

有效但不理想。

黑灯

要作为方法工作,类中的对象需要实现描述符协议的一部分也就是说,它应该有一个__get__方法返回一个可调用对象,该对象已“绑定”到该方法所查找的实例。

这是您可以使用包装函数完成这项工作的一种方法:

class decorator(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, owner):
        def wrapper(*args):
            return self.func(instance, *args) # note, self here is the descriptor object
        return wrapper

您可以改为从 返回某个其他类的实例__get__,而不是函数,并使用该__call__其他类方法来实现包装器。但是,如果您没有使用闭包,则需要将instance显式传递给包装类(以及函数,因为self.func在描述符类之外无法工作)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用实例方法作为另一个类中的装饰器

将参数作为另一个 Python 类中的类方法的装饰器

将装饰器类应用于另一个类的方法

如何围绕另一个类方法包装装饰器?

Python:从另一个类调用装饰器方法

在另一个类的构造函数中使用一个类作为参数

如何使用变量作为另一个类的方法的参数?

将指针类方法作为参数传递给另一个类方法C ++

继承与使用一个类的类对象作为另一个类的字段(Python 3)

使用另一个类从活动扩展的方法

使用Xamarin中另一个类的方法

将类的方法作为参数传递给C ++中的另一个类

将类方法作为回调传递给javascript中的另一个类

使用main方法从另一个类调用一个类

在另一个类中使用一个类的方法

Python如何在另一个类方法中使用一个类

在另一个类中使用一个类的方法

在扩展另一个类的控制器的方法上使用Spring Security批注

如何在另一个记录器类中使用另一个类的变量

php-在另一个使用全局类的类中使用类方法

我如何使用模板类作为另一个类的类型名?

在另一个类中使用类作为数组

从同一个类中的另一个方法访问作为方法传递给另一个类的方法

如何将一个类的实例作为参数传递给装饰该类中定义的实例方法的装饰器?

我们可以在同一个 with 语句中的另一个类中将 contextmanager 装饰器与 __enter__() 和 __exit__() 方法混合使用吗?

从另一个类调用类方法

访问另一个类的类方法/变量

使用一个方法的返回值作为同一个类中另一个方法的参数

如何使用一个类的构造函数作为Java中另一个类的对象的参数?