Créer des attributs spécifiques aux objets en Python

Lors de la défiintion de classes en Python, il est essentiel de comprendre la gestion des attributs. Prenons l'exemple d'une classe représentant des étudiants dans une école.

class EtudiantEcole:
    institut = 'ecole_exemple'

    def selectionner_cours(self):
        print('sélectionne un cours')

Créons plusieurs instances de cette classe.

etudiant1 = EtudiantEcole()
etudiant2 = EtudiantEcole()
etudiant3 = EtudiantEcole()

Si l'attribut de classe est modifié, toutes les instances en sont affectées.

EtudiantEcole.institut = 'ECOLE_EXEMPLE'
print(etudiant1.institut)  # ECOLE_EXEMPLE
print(etudiant2.institut)  # ECOLE_EXEMPLE

Les objets possèdent leur propre espace de noms pour stocker des attributs uniques, distincts de l'espace de noms de la classe qui contient les attributs partagés.

print(etudiant1.__dict__)  # {}
print(etudiant2.__dict__)  # {}

Nous pouvons attribuer des valeurs spécifiques à chaque objet individuellement.

etudiant1.nom = 'jean'
etudiant1.age = 20
etudiant1.genre = 'masculin'

print(etudiant1.nom, etudiant1.age, etudiant1.genre)  # jean 20 masculin

try:
    print(etudiant2.nom)
except AttributeError as erreur:
    print(erreur)  # 'EtudiantEcole' object has no attribute 'nom'

etudiant2.nom = 'marie'
etudiant2.age = 22
etudiant2.genre = 'feminin'

print(etudiant2.nom, etudiant2.age, etudiant2.genre)  # marie 22 feminin

La recherche d'attributs dans Python suit un ordre précis : l'objet lui-même, puis la classe, et enfin une erreur si l'attribut n'est pas trouvé.

Pour initialiser des attributs de manière structurée, nous pouvons définir une fonction.

def initialiser_etudiant(obj, nom_val, age_val, genre_val):
    obj.nom = nom_val
    obj.age = age_val
    obj.genre = genre_val

initialiser_etudiant(etudiant1, 'pierre', 21, 'masculin')
print(etudiant1.nom, etudiant1.age, etudiant1.genre)  # pierre 21 masculin

Cependant, cette approche est manuelle. Pour automatiser l'initialisation lors de la création d'instances, nous utilisons la méthode spéciale __init__.

class EtudiantEcole:
    institut = 'ecole_exemple'

    def __init__(self, nom_val, age_val, genre_val):
        """Exécuté automatiquement lors de l'instanciation."""
        self.nom = nom_val
        self.age = age_val
        self.genre = genre_val
        print('Instance créée avec succès.')

    def selectionner_cours(self):
        print('sélectionne un cours')

En créant une instance sans arguments, une erreur est levée.

try:
    etudiant_invalide = EtudiantEcole()
except TypeError as erreur:
    print(erreur)  # __init__() missing 3 required positional arguments

En fournissant les arguments requis, l'initialisation se fait automatiquement.

etudiant1 = EtudiantEcole('luc', 19, 'masculin')  # Affiche "Instance créée avec succès."
print(etudiant1.__dict__)  # {'nom': 'luc', 'age': 19, 'genre': 'masculin'}

Lors de l'appel de la classe, deux étapes se produisent : la création d'un objet vide et l'exécution automatique de la méthode __init__ avec les paramètres fournis.

Étiquettes: Python classes objets attributs OOP

Publié le 10 juin à 02h21