Magazine

python et les properties

Publié le 01 mai 2008 par Mikebrant

C'est pas très propre tout ca,
allez un coup de Mr Property .

Si vous vous servez de l'encapsulation pour maVariable, ou si vous souhaitez effectuer une opération spéciale lors que l'on accède à celle-ci
il se peut alors que vous ayez à utiliser les getter/setter.

C'est pour ca que property() dont voici son squelette:

property(fget=None,fset=None,fdel=None,doc=None) -> maProperty

fget : getter de maVariable.
fset : setter de  maVariable.
fdel : deletter de maVariable.
doc : chaine qui servira de doc à  maProperty.

maProperty sera un "conteneur" de maVariable c'est à dire que dès lors que l'on accédera/modifiera maProperty on accédéra/modiera maVariable grâce à ses getter/setter qu'elle a passés en paramètres à property() .

#-*- coding:Utf-8 -*-
class MaClasse(object):
 
  def __init__(self,maVariable):
   self._maVariable = maVariable
  
  def get_MaVariable(self):
   if "un" in self._maVariable :
   return " contient un mot interdit"
   return self._maVariable
  
  def set_MaVariable(self,maVariable):
   if type(maVariable)==str:
   self._maVariable = maVariable
   else:
   self._maVariable=" hophophop j'accepte que des chaines"
 
  maProperty = property(get_MaVariable,set_MaVariable
  
if __name__=='__main__':
   monObjet = MaClasse("un")
   print("#### valeur _maVariable ####")
   print monObjet.maProperty 
   print monObjet._maVariable
 
   monObjet.maProperty ="deux"
   print("#### valeur _maVariable après affectation ####")
   print monObjet.maProperty 
   print monObjet._maVariable
   print("#### métadata : type ####")
   print MaClasse.maProperty.__class__
   print monObjet.maProperty.__class__

Ici,
MaClasse doit hériter de Object ,elle est dite alors classe new-style .
Une classe new-style peut utiliser toutes les caractéristiques de Python, dont les properties (les descripteurs, ....) .

maProperty doit être une variable de classe,pourquoi ? on va le voir.

Les premières lignes du __main__ montrent bien qu'en accédat à monObjet.maProperty on accède à  _maVariable .

Les dernières lignes, quant à elles, nous montrent que pour accéder aux métadonnées de l'objet maProperty et non de _maVariable il faut y accéder via MaClasse.maProperty,
c'est pourquoi on la déclare en tant que variable de classe.

Enfin, dans set_MaVariable() et get_MaVariable(), j'ai mis des petites conditions pour vous montrer l'utilité d'une telle chose .

rouge et vert ca rend horriblement moche, c'est pourquoi on va s'arrêter là pour ajourd'hui, en espérant que cette courte intro aux properties vous ait servis.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Mikebrant 9 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte