[Python] Metodi decorati con classi

Pietro Battiston me a pietrobattiston.it
Lun 22 Apr 2013 14:52:34 CEST


Il giorno lun, 22/04/2013 alle 13.53 +0200, Pietro Battiston ha scritto:
> Il giorno lun, 22/04/2013 alle 10.27 +0200, Marco Giusti ha scritto:
> > On Mon, Apr 22, 2013 at 08:58:39AM +0200, Pietro Battiston wrote:
> > [...]
> > >[...] 
> > > 
> > > Il mio problema è semplicemente che i due
> > >     print "self is", self
> > > stampano due cose diverse.
> > 
> > normale perché sono due cose diverse: [...]. Forse è per questo che non si vede spesso oggetti usati
> > come decoratori.
> > 
> > A questo punto mi chiedo l'utilità di avere una classe come decoratore.
> > Incapsulazione? Ereditarietà?
> 
> 
> [...]
> 
> Alla luce del tuo chiarimento però mi è chiaro che questo modo di
> operare è _meno_ potente...

Ritratto:
http://www.outofwhatbox.com/blog/2010/07/python-decorating-with-class/

Sostanzialmente la soluzione è aggiungere alla classe decoratore il
metodo

    def __get__(self, obj, ownerClass=None):
        # Return a wrapper that binds self as a method of obj (!)
        return types.MethodType(self, obj)

e aspettarsi in __call__ il "self" dell'altra classe come secondo
argomento:

    def __call__(self, otherself, *args):
        print "self is", self
        print "otherself is", otherself
        print "args are", args
        print "inside myDecoratorC.__call__()"


Ho provato. Funziona. Con calma finirò anche per capire perché...

ciao

Pietro



Maggiori informazioni sulla lista Python