[Python] override di __getattribute__ per avere getter e setter "automatici"

Marco Giusti marco.giusti a gmail.com
Dom 29 Giu 2008 19:04:31 CEST


On Sun, Jun 29, 2008 at 06:14:05PM +0200, Francesco Stablum wrote:
> Un saluto a tutti,
> mi chiamo Francesco e sono nuovo della lista :-)
> 
> Ho cominciato ad usare il python un paio di mesi fa per lavoro e lo
> trovo un linguaggio estremamente interessante e potente, soprattutto
> sul versante dell'introspezione.
> 
> Vorrei condividere con voi del codice che ho scritto per creare setter
> e getter "automatici".
> 
> potete visionarlo al seguente url:
> http://rafb.net/p/bQDQAF11.html
> 
> l'obiettivo e' quello di creare un "sostituto" di "object" per
> estendere le sue funzionalita' e dare la possibilita'
> di definire variabili d'istanza con l'override degli operatori
> "assegnazione" e "lettura".
> 
> Per raggiungere questo scopo ho ridefinito i metodi __getattribute__ e
> __setattr__
> 
> l'obiettivo e' quello che un pezzo di codice come questo:
> 
> obj.foobar = 42
> 
> chiami il metodo "set_foobar(42)" definito dentro "obj"
> 
> come vi sembra come idea e come design?

non puoi usare le property di python? non ho letto il codice ma mi
sfugge qualcosa


    >>> class Spam(object):
    ...   def _get_egg(self):
    ...     print 'getter'
    ...     return self._egg
    ...   def _set_egg(self, value):
    ...     print 'setter'
    ...     self._egg = value
    ...   egg = property(_get_egg, _set_egg)
    ... 
    >>> spam = Spam()
    >>> spam.egg = 'ciao'
    setter
    >>> spam.egg
    getter
    'ciao'
    >>> 


> inoltre ho un problemino: non riesco ad accedere alla variabile
> "__foobar"  all'interno del metodo __getattribute__
> avete qualche idea? (il problema e' segnato con un FIXME all'interno
> del codice all'url http://rafb.net/p/bQDQAF11.html )

per poter accedere agli attributi devi usare: 

  object__getattribute__(s, privname)
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        non disponibile
Tipo:        application/pgp-signature
Dimensione:  189 bytes
Descrizione: Digital signature
Url:         http://lists.python.it/pipermail/python/attachments/20080629/2d01fa91/attachment.pgp 


Maggiori informazioni sulla lista Python