tengo un decorador declarada como una clase:decoradas con una clase decorador no tienen el "auto" argumento congelada
class predicated(object):
def __init__(self, fn):
self.fn = fn
self.fpred = lambda *args, **kwargs: True
def predicate(self, predicate):
self.fpred = predicate
return self
def validate(self, *args, **kwargs):
return self.fpred(*args, **kwargs)
def __call__(self, *args, **kwargs):
if not self.validate(*args, **kwargs):
raise PredicateNotMatchedError("predicate was not matched")
return self.fn(*args, **kwargs)
... y cuando lo uso para envolver un método en una clase, llamar a ese método no parece establecer la instancia del objeto como primer argumento. Si bien este comportamiento no es exactamente inesperado, ¿cómo haré para congelar self
cuando el método se convierta en un método de instancia?
ejemplo simplificado:
class test_decorator(object):
def __init__(self, fn):
self.fn = fn
def __call__(self, *args, **kwargs):
return self.fn(*args, **kwargs)
class Foo(object):
@test_decorator
def some_method(self):
print(self)
Foo().some_method()
instancia esperada de foo, en lugar obtiene un error diciendo se aprobaron 0 argumentos.
+1 para "Ejemplo simplificado" :) –
Supongo que lo hace porque 'some_method' ya no es una función, sino un objeto - instancia de la clase' test_decorator' - por lo que no crea un método obligado fuera de esto. No tengo idea de cómo hacer que el escenario funcione con una "clase de decorador" ... –