La programmation orientée objet (POO) avec le langage Python

De Wiki de Mémoire Vive
Aller à la navigation Aller à la recherche

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.