Encapsulation
Encapsulation
Encapsulation
Les attributs et les méthodes privés dans la programmation orienté objet ne sont
accessibles que par les membres de la classe.
Vous avez certainement déjà rencontré ces termes en Python : public, privé et
protégé. Ainsi que des noms avec un trait ou deux traits de soulignements au début
ou à la fin.
Les attributs publics sont accessibles à tout objet utilisant l’opérateur point.
class MaClass:
def __init__(self):
self.num = 1
def get_num(self):
return self.num
Dans notre classe, la méthode __init__ définit un attribut num qui est initialisé avec
la valeur 1 et une méthode get_num qui renvoie la valeur de num.
L’exécution du code.
1
1
L’exécution du code.
Pour rendre les attributs et les méthodes privés en Python, préfixez le nom avec un
seul trait de soulignement.
class MaClass:
def __init__(self):
self._num = 1
def _get_num(self):
return self._num
Exécution code.
1
1
Mais ça n’a rien de privé !
En fait, l’accès aux attributs et aux méthodes privés n’est pas réellement ce que
vous croyez ou ce que vous avez peut-être vu dans d’autres langages de
programmation.
En réalité, quand nous disons que les attributs et les méthodes qui commencent par
un seul trait de soulignement sont privés, ce n’est qu’une convention. Python ne
prend pas en charge l’encapsulation.
Même si l’encapsulation n’est pas appliquée, cela ne signifie pas que vous devez
accéder aux attributs et méthodes privés. Ne le faites pas parce que vous n’êtes
pas censé le faire.
En plus de cela, si vous concevez votre propre classe ou bibliothèque, et que vous
voulez indiquer aux utilisateurs de votre bibliothèque qu’ils ne doivent pas accéder
à des attributs ou des méthodes spécifiques, préfixez les noms des variables avec
un seul trait de soulignement.
Et selon la documentation Python, « …Il doit être vu comme un détail pouvant faire
l’objet de modifications futures sans préavis ».
L’encapsulation agit comme une couche de protection qui empêche l’accès aux
données encapsulées par un code défini en dehors de la classe dans laquelle les
données encapsulées sont définies. Donc, l’encapsulation assure la sécurité en
cachant les données du monde extérieur.
def __get_num(self):
return self.__num
obj = MaClass() # créer une instance de classe
# afficher la valeur de l'attribut __num
print(obj.__num)
print(obj.__get_num())
Exécution du code.
Python ne trouve pas l’attribut __num, bien qu’il est défini dans notre classe.
obj = MaClass()
print(dir(obj))
['_MaClass__get_num', '_MaClass__num', '__class__', '__delattr__',
'__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '__weakref__']
Name Mangling ou cette modification « brutale » du nom rend plus difficile l’accès
aux variables depuis l’extérieur de la classe, mais elles sont toujours accessible
via _MaClass__num et _MaClass__get_num.
Donc, en dehors de la classe, vous devrez utiliser le nom modifié de l’attribut, mais
à l’intérieur de la classe, vous pouvez toujours accéder à l’attribut.
Avant de terminer, nous allons profiter pour apprendre certaines autre utilisations
courantes du trait de soulignement en plus de ce que nous avons vu plus haut et
des méthodes spéciales.
Un seul trait de soulignement est un nom de variable temporaire qui ne sera pas
réutilisée.
for _ in range(3):
print('Python')
Python
Python
Python
De plus, un trait de soulignement seul est une variable spéciale qui représente le
résultat de la dernière expression évaluée.
>>> 5 + 5
10
>>> _
10
Parfois on utilise un mot-clé Python comme class, type, list, comme nom de
variable, ce qui nous donne une SyntaxError.
Pour éviter les conflits des noms, ajoutez un seul trait de soulignement au nom de la
variable.