La programmation orientée objet (POO) avec le langage Python
1. Programmation orientée objet avec Python :[modifier]
La programmation orientée objet (POO) en Python est un paradigme essentiel pour structurer votre code de manière organisée et modulable.
Classe : par exemple "Personne".
Objet : Instance de classe (ex : Moi).
Attribut : Variable de classe (ex : nom, prénom, âge, lieu_résidence,...).
Propriété : Manière de manipuler les attributs (lecture seule, accès non autorisé en dehors de la classe, etc.).
Méthode : Fonction d'une classe (ex : parler).
Méthode de classe : Fonction d'une classe...
Méthode statique : Fonction d'une classe, mais indépendante de celle-ci.
Héritage : Classe Fille qui hérite d'une classe Mère (Fille est une sorte de Mère). Classe Chat qui hérite de la classe Animal.
2. Classes et attributs :[modifier]
Premier exemple de création d’un objet avec les attributs par défaut en « dur », j’ai ajouté la création d’une propriété en lecture seule « nom_complet » ce qui est facultatif.
#!/usr/bin/env python3.10 #-*- coding: utf-8 -*- class Personne: # Définition de notre classe Personne def __init__(self): # Notre méthode constructeur self.nom = "Renaudeau" # Définition des attributs self.prénom = "Dominique" self.âge = 59 self.lieu_résidence = 'Gascougnolles' @property # Création d'une propriété en lecture seule def nom_complet(self): return f"{self.prénom} {self.nom}" # ******************************************************* Moi = Personne() # Moi est un objet de classe Personne # Affichage des valeurs des attributs print("Mon nom : ",Moi.nom) print("Mon prénom : ",Moi.prénom) print("Mon age : ",Moi.âge,"ans") print("Mon lieu de résidence : ",Moi.lieu_résidence) # Modification de l'attribut prénom Moi.prénom = 'Alexandre' print("Mon prénom après changement : ",Moi.prénom) print("Moi : ",type(Moi)) # Afficher la classe de l'objet Moi print("Affichage du nom complet avec la propriété : ",Moi.nom_complet)
Deuxième exemple de création d’un objet avec les attributs que l'on peut saisir, la propriété « nom_complet » peut maintenant être modifiée avec mise à jour du prénom et du nom.
#!/usr/bin/env python3.10 #-*- coding: utf-8 -*- class Personne: # Définition de notre classe Personne def __init__(self, nom, prénom): # Notre méthode constructeur self.nom = nom # Définition des attributs self.prénom = prénom @property # Création d'une propriété en lecture seule def nom_complet(self): return f"{self.prénom} {self.nom}" @nom_complet.setter # Possibilité de changer la valeur de la propriété def nom_complet(self, nouveau_nom): prénom, nom = nouveau_nom.split(" ") # On coupe le nouveau nom à l'espace self.prénom = prénom # Mise à jour des attributs prénom et nom self.nom = nom # *************************************************************************** Moi = Personne("Renaudeau","Dominique") # Moi est un objet de classe Personne # Affichage des valeurs des attributs print("Mon nom : ",Moi.nom) print("Mon prénom : ",Moi.prénom) print("Affichage du nom complet avec la propriété : ",Moi.nom_complet) # On modifie le nom_complet en séparant prénom et nom par un espace Moi.nom_complet = "Alexandre Dumas" print("Mon nom : ",Moi.nom) print("Mon prénom : ",Moi.prénom) print("Affichage du nom complet avec la propriété : ",Moi.nom_complet)
3. Méthodes standard, de classe et statique :[modifier]
Les méthodes sont des fonctions définies à l'intérieur d'une classe en Python. Elles opèrent sur les instances de cette classe (objets) et sont utilisées pour définir le comportement de ces objets.
Une méthode est définie comme une fonction normale, mais à l'intérieur d'une classe et avec un premier paramètre self qui représente l'instance de l'objet.
#!/usr/bin/env python3.10 #-*- coding: utf-8 -*- class Personne: # Définition de notre classe Personne lieu_habitation = "Vouillé" def __init__(self, nom, prénom): # Notre méthode constructeur self.nom = nom # Définition des attributs self.prénom = prénom # Méthode standard "d'instance self" : fonction sur une instance (objet) def parler(self, message): print("{} {} a dit : {}".format(self.prénom, self.nom, message)) # cls : Méthode de classe def changer_ville(cls, nouvelle_ville): Personne.lieu_habitation = nouvelle_ville changer_ville = classmethod(changer_ville) # Méthode statique : fonction indépendante mais lié à une classe def definition(): print("Tests des méthodes") definition = staticmethod(definition) # *************************************************************************** Moi = Personne("Renaudeau","Dominique") # Moi est un objet de classe Personne Moi.parler("Bonjour !") print("Lieu d'habitation : ",Moi.lieu_habitation) Moi.changer_ville("Niort") print("Nouveau lieu d'habitation : ",Moi.lieu_habitation) Personne.definition()
- Méthodes d'instance : Les plus courantes. Elles opèrent sur l'instance de la classe et utilisent self.
- Méthodes de classe : Le premier paramètre est cls au lieu de self. Elles opèrent sur la classe elle-même, pas sur l'instance.
- Méthodes statiques : Elles n'ont ni self ni cls comme premier paramètre. Elles ne peuvent pas accéder aux attributs ou aux méthodes d'instance ou de classe.
On peut également utiliser les décorateurs @classmethod et @staticmethod.
4. Les propriétés :[modifier]
En Python, les propriétés (ou properties en anglais) sont une manière élégante d'encapsuler l'accès aux attributs d'un objet. Elles permettent de définir des méthodes (fonctions) qui sont appelées automatiquement lorsque vous accédez, modifiez ou supprimez un attribut.
Une manière courante de définir des propriétés est d'utiliser la fonction intégrée property() :
#!/usr/bin/env python3.10 #-*- coding: utf-8 -*- class Personne: # Définition de notre classe Personne def __init__(self, nom, prénom, age): # Notre méthode constructeur self.nom = nom # Définition des attributs self.prénom = prénom self._age = age # Les propriétées # Par convention je mets un _ devant les noms des propriétés et d'age def _getage(self): try : return self._age except AttributeError: # si l'attribut age a été supprimé print("L'âge n'existe pas !") def _setage(self, nouvel_age): # Si l'âge est inférieur à zéro il est égal à zéro if nouvel_age < 0: self._age = 0 else: self._age = nouvel_age def _delage(self): del self._age # property(<getter>, <setter>, <deleter>, <helper>) age = property(_getage, _setage, _delage, "Information : Âge de la personne - S'affiche avec help(Personne.age)") # ***************************** Programme principal ************************************** Moi = Personne("Renaudeau", "Dominique", 59) # Moi est un objet de classe Personne # Afficher l'age - On appelle _getage print(Moi.age) # Modifier l'age - On appelle _setage - Puis l'afficher Moi.age = -5 print(Moi.age) # Supprimer l'attribut age - On appelle _delage del Moi.age print(Moi.age) # On peut faire help(Personne) pour avoir des informations sur la classe # On peut afficher les informations sur age avec help(Personne.age)
Une autre manière plus concise de définir des propriétés est d'utiliser des décorateurs.