Python:从另一个类调用decorator方法



假设我有一个定义了装饰器的类

class Foo():
    def decorate(param):        
        def wrapper(func):
            def wrapped(*args, **kwargs):
                # do something
                return func(*args, **kwargs)
            return wrapped
        return wrapper

然后我决定在另一个类中调用这个decorator,像这样:

class Bar():
    foo = Foo()
    param = something
    @foo.decorate(param)
    def func():
        # do something

这会引发一个TypeError异常:

TypeError: decorate() takes 1 positional argument but 2 were given
我不明白这里出了什么问题。应用相同的装饰器,但在相同的类Bar中定义工作良好,但为什么它不能工作在不同的类?

你的decorate()函数应该是一个实例方法,因此它接受实例本身作为第一个参数,当你调用- @foo.decorate(param)时,你试图传递它两个参数(因为fooFoo类的实例)实例本身,以及param,这是导致问题的。

您应该转换您的decorate()方法以接受实例作为第一个参数。例子——

class Foo():
    def decorate(self, param):        
        def wrapper(func):
            def wrapped(*args, **kwargs):
                # do something
                return func(*args, **kwargs)
            return wrapped
        return wrapper

另一件事,你的func()也是一个实例方法,也需要self。例子——

class Bar():
    foo = Foo()
    param = something
    @foo.decorate(param)
    def func(self):
        # do something

你只是忘了包括self;您正在调用Foo().decorate(),一个绑定方法,因此实例将被传入:

class Foo():
    def decorate(self, param):        

注意,这同样适用于您的Bar.func()函数:

class Bar():
    foo = Foo()
    param = something
    @foo.decorate(param)
    def func(self):
        # do something

最新更新