2011-04-11 6 views
5

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.

+0

+1 para "Ejemplo simplificado" :) –

+0

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" ... –

Respuesta

4

lo descubrió - es necesario definir un método __get__ con el fin de crear una unión MethodType así:

def __get__(self, obj, objtype=None): 
    return MethodType(self, obj, objtype) 

que crea un objeto MethodType al invocar el método en un objeto que se congela el argumento self.

+0

[Este] (http://stackoverflow.com/questions/5469956/python-decorator-self-is-mixed-up) publicar conversaciones sobre el protocolo descriptor – Pakman

Cuestiones relacionadas