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'
我真的不明白这里出了什么问题,我也在互联网上看到了一些教程,他们做了类似的事情并且它有效。有人可以解释一下这里出了什么问题以及如何解决它吗?
什么是装饰器?它是更详细语法的语法糖。
@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]
...
当你使用
@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):
...
您必须传递参数
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):
...