[英]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.