Outils pour utilisateurs

Outils du site


decorateurs_property

Ceci est une ancienne révision du document !


Modèles de code pour utiliser les @property

Problématique

Avec les classes “nouveau style”, utiliser “property” est intéressant parce que ça permet en même temps:

  • de manipuler (lecture/écriture/destruction) des attributs comme s'ils étaient 'normaux' (toto.x = 123, y = toto.x, del toto.x)
  • d'obliger ces manipulations d'attribut à passer par des méthodes définies dans la classe
  • voire, d'empêcher certaines de ces manipulations si les méthodes correspondantes n'existent pas

Voir http://docs.python.org/library/functions.html#property

Codes proposés

Parmi les différents codes possibles, j'en ai retenu 2:

Version avec décorateur:

def Property(func):
    return property(**func()) 
 
class Maclasse(object):
 
    def __init__(self, x):
        self._x = x
 
    @Property
    def x():
 
        doc = "docstring de x"
 
        def fget(self):
            return self._x
 
        def fset(self, x):
            self._x = x
 
        def fdel(self):
            del self._x
 
        return locals()

Version sans décorateur:

class Maclasse(object):
 
    def __init__(self, x):
        self._x = x
 
    def x():
        doc = "docstring de x"
 
        def fget(self):
            return self._x
 
        def fset(self, x):
            self._x = x
 
        def fdel(self):
            del self._x
 
        return locals()
 
    x = property(**x())

Exemple d'utilisation

Pour bien comprendre comment ça marche, on va créer une classe Test avec un attribut x qui sera manipulé par property. on va ajouter des 'print' pour signaler l'appel aux fonctions qui vont agir sur x. Et on va retirer la méthode de destruction de l'attribut:

class Test(object):
 
    def __init__(self, x):
        self._x = x
 
    def x():
        doc = "docstring de x"
 
        def fget(self):
            print "appel à fget"
            return self._x
 
        def fset(self, x):
            print "appel à fset"
            self._x = x
 
        return locals()
 
    x = property(**x())

Essayons maintenant des appels:

 


Amusez-vous bien!

decorateurs_property.1302069699.txt.gz · Dernière modification: 2011/04/06 08:01 de tyrtamos

Outils de la page