Sites


Initiation à python

Privatiser attributs et méthodes

Le but de la programmation objet est de mieux structurer le code pour mieux contrôler les contextes d'exécution. En effet, tout programme commence avec quelques petites lignes et finit souvent par plusieurs milliers et il devient alors plus difficile de retrouver ces marques et de bien continuer.
Les défauts de conception n'apparaissent en général pas au début des projets mais bien à la suite, lors des modifications successives, éventuellement réalisées par plusieurs personnes qui ont chacune leur vision des choses.
Différencier les attributs de classe et d'instance est une première approche améliorée, mais il est aussi possible de définir explicitement ce qui peut être de l'extérieur de l'objet. Jusqu'à présent, tout attribut et toute méthode peut être appelé du programme principal. Alors que dans la pratique certains d'entre eux seront certainement créé pour un usage interne en pré-traitement d'informations. Ces attributs n'ont pas besoin, et ne devraient donc pas laisser cette tentation d'être accessible de l'extérieur.
Un petit exemple pour voir de quoi il s'agit :

class MaClasse:
    def __init__(self):
            self.__essai="Bonjour "
            self.essai="le monde"
    def affiche(self):
            print self.__essai
    def montre(self):
            print self.__essai

objet=MaClasse()
print objet.essai

Le résultat sera bien

le monde

Maintenant essayons avec

print objet.__essai
File "private_public.py", line 15, in <module>
    print objet.__essai
    AttributeError: MaClasse instance has no attribute '__essai'  

L'interpréteur nous informe que la classe n'a pas d'attribut de ce nom. Ce n'est évidemment pas exactement vrai, mais il garde le secret sur la possibilité de manière à ne pas nous tenter : __essai est privé et ne peut être utilisé que depuis une méthode de la classe :

objet.affiche()
> Bonjour 

Comment avons nous fait pour rendre cette variable privée ? nous avons simplement rajouté deux _ en début de nom. Remarquez au passage que essai et __essai sont considérés comme étant deux attributs différents par l'interpréteur alors que pour le lecteur ils seront évidemment très similaires.
La même opération peut être réalisée avec les méthodes :

class MaClasse:
    def __init__(self):
           self.__essai="Bonjour "
    def affiche(self):
           print self.essai
    def __montre(self):
           print self.__essai, self.essai

objet=MaClasse()
objet.__montre()
File "private_public.py", line 15, in <module>

objet.__montre()
AttributeError: MaClasse instance has no attribute '__montre'

alors que :

class MaClasse:
   def __init__(self):
          self.__essai="Bonjour "
          self.essai="le monde"
   def affiche(self):
          self.__montre()
   def __montre(self):
          print self.__essai, self.essai

objet=MaClasse()
objet.affiche()  

renverra :

Bonjour  le monde
Note : En fait, il existe plusieurs notations. On trouvera souvent référence à _variable comme étant une convention d'écriture. Cette convention était utilisée à titre mnémotechnique dans les moments où python ne gérait pas la privatisation des données. Une autre solutions existe aussi : __variable__. Dans ce cas, la variable est absolument privée et rappellera les méthodes par défaut comme __init__, __del__… En fait, __variable ne produit une variable que partiellement variable qui est bien interdite d'accès hors du contexte mais qui peut toujours être appelée par le biais du chemin complet : instance._classe__variable

Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.

Vous devriez rafraîchir la page.