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.