Encapsulation en Python
Introduction
L’encapsulation est l’un des aspects fondamentaux de la programmation orientée objet. Il permet aux programmeurs de mieux contrôler la façon dont les données circulent dans leurs programmes et de protéger ces données. L’encapsulation transforme également les objets en pièces plus autonomes et fonctionnant indépendamment.
Le concept d’encapsulation s’appuie sur ce que vous avez fait dans les deux derniers guides avec les classes et les constructeurs. Les constructeurs sont généralement utilisés en étroite collaboration avec l’encapsulation et aident en fait à faire fonctionner l’encapsulation de manière transparente.
Modificateurs d’accès
Avant de pouvoir tirer parti de l’encapsulation, vous devez comprendre comment Python restreint l’accès aux données stockées dans les variables et les méthodes.
Python a différents niveaux de restriction qui contrôlent comment les données peuvent être accédées et à partir de où. Les variables et les méthodes peuvent être publiques, privées ou protégées. Ces désignations sont faites par le nombre de traits de soulignement avant la variable ou la méthode.
publique
Toutes les variables et méthodes que vous avez vues jusqu’à présent, à l’exception des constructeurs, ont été publiques. Les variables publiques et les méthodes peuvent être librement modifiées et exécutées de n’importe où, à l’intérieur ou à l’extérieur de la classe. Pour créer une variable ou une méthode publique, n’utilisez pas de traits de soulignement.
privée
La désignation private permet uniquement d’accéder à une variable ou à une méthode à partir de sa propre classe ou objet. Vous ne pouvez pas modifier la valeur d’une variable privée en dehors d’une classe. Les variables et méthodes privées sont précédées de deux traits de soulignement. Jetez un coup d’œil à l’exemple ci-dessous.
__make = 'Dodge'Essayez d’utiliser cette classe d’avant. Définissez les variables du constructeur sur private. Essayez ensuite d’imprimer l’une des variables après qu’un objet a été instancié.
class Car(object):
def __init__(self, make = 'Ford', model = 'Pinto', year = '1971', mileage = '253812', color = 'orange'):
self.__make = make
self.__model = model
self.__year = year
self.__mileage = mileage
self.__color = color
def move_forward(self, speed):
print("Your %s is moving forward at %s" % (self.__model, speed))
def move_backward(self, speed):
print("Moving backward at %s" % speed)
mycar = Car()
print(mycar.__model)
Vous recevrez un message d’erreur indiquant que la variable n’existe pas. C’est parce que cette variable est privée. Essayez maintenant d’exécuter la méthode move_forward.
mycar.move_forwardTout fonctionne bien. C’est parce que la variable est accessible par une méthode au sein de la classe, et non en externe.
Il y a un hic ici. Python ne gère pas exactement les variables protégées aussi bien que d’autres langages orientés objet. Au lieu de protéger les variables, il change leur nom dans l’interpréteur. Cela permet de créer et d’exister différentes copies de la variable. Essayez de modifier l’une des variables protégées dans votre objet mycar et de l’imprimer.
mycar.__model = 'Mustang'
print(mycar.__model)
Maintenant, cela semble fonctionner, mais ce que vous avez imprimé est une copie étrange de la variable protégée. Essayez à nouveau d’utiliser la méthode move_forward.
mycar.move_forwardIl a imprimé la valeur originale de __model. Les variables existent indépendamment. Vous pouvez illustrer cela en imprimant l’objet sous forme de dictionnaire. Vous verrez deux variables différentes.
print(mycar.__dict__)Protégé
Les variables et méthodes protégées sont très similaires aux variables privées. Vous n’utiliserez probablement pas très souvent des variables ou des méthodes protégées, mais il vaut toujours la peine de savoir ce qu’elles sont. Une variable protégée n’est accessible que par sa propre classe et par toutes les classes dérivées de celle-ci. C’est plus un sujet pour plus tard, mais sachez simplement que si vous utilisez une classe comme base d’une autre, les variables protégées peuvent être une bonne option. Les variables protégées commencent par un seul trait de soulignement.
Qu’est-ce que l’encapsulation
Donc, maintenant que vous savez comment fonctionnent les modificateurs d’accès, la partie suivante va sembler assez évidente. L’encapsulation est le processus d’utilisation de variables privées au sein des classes pour empêcher toute modification involontaire ou potentiellement malveillante des données. En contenant et en protégeant les variables au sein d’une classe, il permet à la classe et aux objets qu’elle crée de fonctionner comme des parties indépendantes, autonomes, fonctionnant dans la machine du programme lui-même.
Grâce à l’encapsulation, les variables et certaines méthodes ne peuvent être utilisées que par le biais des interfaces désignées par la classe elle-même.
Setters et Getters
Les interfaces utilisées pour interagir avec les variables encapsulées sont généralement appelées méthodes setter et getter, car elles sont utilisées pour définir et récupérer les valeurs des variables. Étant donné que des méthodes existent au sein d’une classe ou d’un objet, elles peuvent accéder aux variables privées et les modifier, alors que vous ne pourrez pas le faire depuis l’extérieur de la classe. Lorsque vous avez instancié votre objet mycar, vous avez essentiellement utilisé son constructeur comme méthode de réglage initiale.
Essayez d’écrire un ensemble de méthodes pour définir et obtenir la valeur de l’une des variables mycar.
def set_model(self, new_model):
self.__model = new_model
def get_model(self):
return self.__model
Cela peut sembler beaucoup de travail supplémentaire, mais ce n’est vraiment pas difficile du tout. D’une manière générale, c’est ainsi que vous devriez structurer vos classes et travailler avec des variables de classe.
Réflexions finales
L’encapsulation est une partie importante de la programmation orientée objet. C’est une grande partie de ce qui fait que les objets en programmation fonctionnent plus comme des objets physiques dans le monde réel. Il sert également à protéger les données stockées dans vos objets et fournit un contrôle et des conventions sur la façon dont vous devez gérer le flux de données à l’intérieur et à l’extérieur des classes.
Exercices
- Rendez toutes les variables de la classe
Carprivées. - Essayez d’en imprimer un de l’extérieur de la classe.
- Modifiez la méthode
move_forwardpour utiliser lemodèlede variable privée et appelez-la. - Créez une méthode setter pour l’une des variables.
- Utilisez la méthode setter que vous avez créée pour modifier la valeur d’une variable.
- Créez une méthode getter pour la même variable que la méthode setter.
- Utilisez votre méthode getter pour accéder à cette variable et l’imprimer.