Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

En programmation orientée objet, toutes les données et méthodes ne sont pas destinées à être accessibles directement depuis l'extérieur de la classe. Parfois, vous voulez cacher les détails internes pour qu'ils ne puissent être utilisés qu'au sein de la classe elle-même.

En Python, vous pouvez indiquer qu'un attribut ou une méthode est privé(e) en commençant son nom par deux underscores (__).

Bien que cela ne rende pas l'accès impossible, cela active une fonctionnalité appelée mangling de nom (obscurcissement de nom), qui modifie le nom de l'attribut en interne pour qu'il soit plus difficile d'y accéder depuis l'extérieur.


Pourquoi utiliser des membres privés ?

Les attributs et méthodes privés :

  • Aident à protéger les données contre des modifications accidentelles.
  • Clarifient quelles parties de votre classe sont internes et ne doivent pas être utilisées par du code extérieur.
  • Vous permettent de modifier l'implémentation interne sans casser le code extérieur qui utilise votre classe.

IMPORTANT : La confidentialité en Python est une convention, pas une contrainte. Les membres privés peuvent toujours être accédés si quelqu’un insiste, mais l’intention est que vous ne le fassiez pas.


Exemple : une classe Person

class Person:
    def __init__(self, name, age):
        self.name = name          # Attribut public
        self.__age = age          # Attribut privé

    def print_name(self):
        print("Name:", self.name)

    def print_info(self):
        self.print_name()
        self.__print_age()        # Appel d'une méthode privée depuis l'intérieur de la classe

    def __print_age(self):        # Méthode privée
        print("Age:", self.__age)

p = Person("John", 30)

p.print_name()        # Fonctionne : Name: John
p.print_info()        # Fonctionne : Name: John  Age: 30

Que se passe-t-il si vous tentez d’accéder à un attribut privé ?

Si vous essayez d’accéder directement à un membre privé depuis l’extérieur de la classe, vous obtiendrez une AttributeError :

p = Person("John", 30)
print(p.__age)  # ❌ Ceci provoquera une erreur

Pourquoi ? Parce que Python change automatiquement le nom __age en _Person__age en interne (mangling de nom). Cela aide à éviter un accès accidentel ou des conflits avec des sous-classes.


Accéder aux données privées (si vraiment nécessaire)

Techniquement, vous pouvez toujours accéder aux membres privés en utilisant leur nom transformé :

print(p._Person__age)  # 30

Mais cela va à l’encontre de l’idée de confidentialité — vous ne devriez le faire que dans des situations rares de débogage, pas dans la logique normale du programme.


Méthodes privées

Tout comme les attributs, les méthodes peuvent être rendues privées avec deux underscores. Dans notre exemple, __print_age() est privé — vous ne pouvez pas l’appeler depuis l’extérieur de la classe :

p.__print_age()  # ❌ Ceci provoquera une erreur

Mais cela fonctionne parfaitement à l’intérieur de la classe elle-même, comme on le voit dans print_info().

Quand utiliser des membres privés

Utilisez des attributs et méthodes privés lorsque :

  • Vous voulez éviter une mauvaise utilisation accidentelle des parties internes de votre classe.
  • Vous devez contrôler comment les données sont accessibles ou modifiées (souvent avec des méthodes getter et setter).
  • Vous créez une séparation claire entre l’API publique d’une classe (ce qui doit être utilisé depuis l’extérieur) et ses détails d’implémentation.

En résumé

Les membres privés en Python :

  • Commencent par __ (double underscore).
  • Sont destinés à un usage interne uniquement.
  • Sont encore techniquement accessibles via le mangling de nom, mais vous devriez respecter leur confidentialité.

Ils sont un signal pour les autres programmeurs (et pour vous-même dans le futur !) sur ce qui est sûr à utiliser et ce qui est un détail interne que vous pourriez changer plus tard sans prévenir.