簡體   English   中英

class 中的 Python 裝飾器:缺少所需的位置 arguments:

[英]Python decorator in a class: missing required positional arguments:

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):
       ...

所以基本上我有這個 class,我想在從 class 調用方法之前自動調用 function“update()”。 但我得到這個錯誤:

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

我真的不明白這里出了什么問題,我也在互聯網上看到了一些教程,他們做了類似的事情並且它正在工作。 有人可以解釋一下這里出了什么問題,我該如何解決?

什么是裝飾器? 它是更詳細語法的語法糖。

@decorator
def my_fun():
   ...

是相同的

my_fun = decorator(my_fun)

所以在你的具體情況下

method = add_update(method)

你看到問題了嗎? 添加更新需要兩個參數(self 和 func),但這里它只得到一個(實際上您將方法作為self傳遞)。

為了解決這個問題,你需要在 class 之外創建裝飾器,它只獲得 function,並且函數的第一個參數將是 self:

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

當你使用@add_update時,它相當於add_update(method) ,此時add_update仍然是一個 function。

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

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):
        ...

您必須傳遞參數func並在裝飾器 function 中定義 class。

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):
        ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM