Les classes en Python nous permettent d'organiser le code en encapsulant des données et des fonctions liées. Dans certains cas, nous pourrions vouloir empêcher l'utilisation de certaines variables depuis l'extérieur de la classe. Python permet d'avoir des variables privées dans les classes pour empêcher les utilisateurs du code d'accéder à ces variables. Les variables privées sont définies en ajoutant deux underscores au début du nom de la variable (__). Alors que les variables publiques peuvent être directement accessibles en dehors de la classe, les variables privées ne le sont pas. Illustrons cela :
class PublicPrivateExample:
def __init__(self):
self.public_var = 'I am public!' # Variable publique
self.__private_var = 'I am private!' # Variable privée
example = PublicPrivateExample()
print(example.public_var) # 'I am public!'
print(example.__private_var) # Lève AttributeError
Dans ce cas, nous pouvons voir que la variable publique est facilement accessible. Cependant, si nous essayons d'accéder à la variable privée, Python lèvera une AttributeError.
Python n'a pas de membres privés stricts comme d'autres langages tels que Java ou C++. En Python, un membre privé est simplement une convention qui suggère de ne pas accéder au membre directement. Python utilise le name mangling (modification du nom) pour rendre moins probable l'accès ou la modification accidentelle d'une variable privée. Cependant, il est toujours possible d'y accéder si nécessaire, bien que cela soit généralement déconseillé :
print(example._PublicPrivateExample__private_var) # I am private!
L'accès à la variable privée se fait en utilisant _ClassName__private_var. Cela décourage son accès direct et encourage l'encapsulation. Vous devriez fournir des méthodes publiques si vous souhaitez donner accès aux variables privées :
class PublicPrivateExample:
def __init__(self):
self.__private_var = 'I am private!'
def get_private_var(self): # Méthode getter pour la variable privée
return self.__private_var # Nous pouvons accéder aux champs privés à l'intérieur de la classe
example = PublicPrivateExample()
print(example.get_private_var()) # Affichera 'I am private!'
Ici, nous utilisons une méthode publique get_private_var pour fournir un moyen contrôlé d'accéder à notre variable privée. De cette façon, nous maintenons l'encapsulation et l'intégrité de nos données.
💭
Gardez à l'esprit que l'utilisation de variables privées fait partie de la pratique de l'encapsulation, qui est l'un des fondements de la programmation orientée objet. Elle protège les données contre les modifications et les accès inattendus.
Ainsi, même si Python n'impose pas strictement les variables privées, il est bon de les utiliser pour rendre votre code plus maintenable et sans erreurs.
Défi : Classe Database
On vous demande de développer une classe Database en Python qui stocke des paires name: value. La base de données doit être représentée comme un dictionnaire privé à l'intérieur de la classe Database.
La classe Database doit avoir les méthodes suivantes :
insert(name, value) : Cette méthode doit insérer une nouvelle paire name: value dans la base de données. Si le name existe déjà dans la base de données, elle doit afficher un message disant Name already exists in the database..
delete(name) : Cette méthode doit supprimer une paire name: value existante de la base de données. Si le name n'existe pas, elle doit afficher un message disant Name does not exist in the database..
update(name, value) : Cette méthode doit mettre à jour la value d'un name existant dans la base de données. Si le name n'existe pas, elle doit afficher un message disant Name does not exist in the database..
display() : Cette méthode doit afficher toutes les paires name: value dans la base de données au format name: value. Toutes les valeurs doivent être séparées par une virgule suivie d'un espace (, ).