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): ...Básicamente, tengo esta clase y quiero llamar a la función "actualizar ()" automáticamente antes de llamar a un método de la clase. Pero me sale este error:
TypeError: add_update() missing 1 required positional argument: 'func'Realmente no entiendo qué está mal aquí, también vi algunos tutoriales en Internet donde hicieron algo similar y funcionó. ¿Puede alguien explicarme qué está mal aquí y cómo lo soluciono?
¿Qué es un decorador? Es azúcar sintáctico para una sintaxis más detallada.
@decorator def my_fun(): ...es lo mismo que
my_fun = decorator(my_fun)Así que en tu caso específico
method = add_update(method)¿Ves un problema? Agregar actualización espera dos parámetros (self y func), pero aquí solo obtiene uno (y en realidad pasa el método como self ).
Para resolver esto, debe crear un decorador fuera de la clase que solo obtenga la función, y el primer parámetro de la función será self:
def add_update(func): def wrapper(*args): self = args[0] ...cuando usa @add_update , es equivalente a add_update(method) , en este momento add_update sigue siendo una función.
Puedes hacer las siguientes modificaciones para que funcione
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): ...Tienes que pasar el argumento func y definir la clase dentro de la función decoradora.
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): ...