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

Python: Calling a decorator method from another class

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

class Foo():

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

然后我决定在另一个 class 中调用该装饰器,如下所示:

class Bar():

    foo = Foo()
    param = something

    @foo.decorate(param)
    def func():
        # do something

这引发了一个 TypeError 异常:

TypeError: decorate() takes 1 positional argument but 2 were given

我不明白这里出了什么问题。应用相同的装饰器但在相同的 class Bar 中定义工作正常,但为什么它不能在不同的 classes 上工作?

你的 decorate() 函数应该是一个实例方法,因此它接受实例本身作为第一个参数,当你调用 - @foo.decorate(param) 时,你试图向它传递两个参数(因为fooFoo class) 实例本身以及 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