类中的Python装饰器:缺少必需的位置参数:

问题描述 投票:0回答:3
class Something:
    def __init__(self, ...):
       ...

    def update(self):
       ...

    def add_update(self, func):
      def fct(*args, **kwargs):
          self.update()
          func(*args, **kwargs)
      return fct 

    @add_update
    def method(self, some_parameter):
       ...

所以基本上我有这个类,我想在调用类中的方法之前自动调用函数“update()”。但我收到这个错误:

TypeError: add_update() missing 1 required positional argument: 'func'

我真的不明白这里出了什么问题,我也在互联网上看到了一些教程,他们做了类似的事情并且它有效。有人可以解释一下这里出了什么问题以及如何解决它吗?

python python-decorators python-class positional-argument
3个回答
3
投票

什么是装饰器?它是更详细语法的语法糖。

@decorator
def my_fun():
   ...

相同
my_fun = decorator(my_fun)

所以在你的具体情况下

method = add_update(method)

你发现问题了吗? Add update 需要两个参数(self 和 func),但这里它只得到一个(实际上你将 method 作为 self 传递)。

要解决这个问题,您需要在仅获取函数的类之外创建装饰器,并且该函数的第一个参数将是 self:

def add_update(func):
     def wrapper(*args):
         self = args[0]
         ...

0
投票

当你使用

@add_update
时,就相当于
add_update(method)
,此时
add_update
仍然是一个函数。

您可以进行以下修改以使其工作

class Something:
    def __init__(self):
        ...

    def update(self):
        ...

    def add_update(f):
        def fct(self, *args, **kwargs):
            self.update()
            return f(self, *args, **kwargs)

        return fct

    @add_update
    def method(self, some_parameter):
        ...


0
投票

您必须传递参数

func
并在装饰器函数中定义类。

class Something:
    def __init__(self,..):
        ...
      

    def update(self):
       ...

    def add_update( func):
      def fct(*args, **kwargs):
          args[0].update() #or Something.update()
          func(*args, **kwargs)
      return fct 

    @add_update
    def method(self, some_parameter):
        ...
© www.soinside.com 2019 - 2024. All rights reserved.