L'encapsulation
Introduction
L'encapsulation consiste à regrouper les données et les traitements associés dans une classe, tout en contrôlant la manière dont son état est consulté et modifié.
En C#, les niveaux d'accès public, protected, private, etc. définissent des restrictions d'accès. Python ne propose pas de restrictions équivalentes pour les attributs et les méthodes. Il utilise principalement des conventions de nommage :
name: membre public._name: membre considéré comme interne, dont l'utilisation depuis l'extérieur est déconseillée.__name: nom transformé par Python pour limiter les collisions, notamment avec les classes dérivées. Ce mécanisme ne rend pas le membre strictement privé.
Contrôler l'accès avec une propriété
Le décorateur @property permet d'exposer un attribut à travers une méthode, tout en conservant une syntaxe d'accès simple. Une méthode associée avec @nom.setter contrôle sa modification.
class Product:
def __init__(self, name: str, price: float):
self.name = name
self.price = price
@property
def price(self) -> float:
return self._price
@price.setter
def price(self, value: float) -> None:
if value < 0:
raise ValueError("Le prix ne peut pas être négatif.")
self._price = value
L'affectation self.price = price dans __init__ utilise le setter et applique donc la validation dès l'initialisation.
product = Product("Clavier", 69.79)
product.price = 39.90
print(product.price) # 39.9
product.price = -10 # Déclenche une exception ValueError
Ce mécanisme est comparable à une propriété C# possédant un accesseur get (getter) et un accesseur set (setter). L'attribut _price reste cependant accessible depuis l'extérieur.