Maîtriser les objets et classes Python : guide pratique
Objets et classes Python
Ce tutoriel explore les fonctionnalités orientées objet fondamentales de Python, vous guidant à travers la création de classes, l'instanciation et les bonnes pratiques pour un code robuste.
Vidéo : Classes et objets Python
Objets et classes Python
Python est fondamentalement orienté objet. Alors que la programmation procédurale se concentre sur les fonctions, la POO centre sur les objets qui regroupent données et comportement.
Un objet est un ensemble d'attributs (données) et de méthodes (fonctions). Une classe est le plan qui définit la structure d'un objet.
Pensez à une classe comme un plan de maison — détaillant pièces, portes, fenêtres. Chaque maison construite est un objet, ou instance, créée depuis ce plan.
Plusieurs objets peuvent être construits depuis la même classe. L'instanciation est le processus de création d'un objet depuis une classe.
Définir une classe en Python
Les définitions de classe commencent avec le mot-clé class, miroir de la façon dont les fonctions commencent avec def. La première chaîne dans une classe est la docstring, fournissant une description concise.
class MaNouvelleClasse:
'''Ceci est une docstring. J'ai créé une nouvelle classe'''
pass
Définir une classe établit un nouvel espace de noms pour ses attributs, qui peuvent être des données ou des méthodes. Les attributs spéciaux commençant par des doubles underscores, comme __doc__, contiennent des métadonnées comme la docstring.
Une fois définie, un objet classe est créé et peut être utilisé pour accéder aux attributs ou instancier de nouveaux objets.
class Personne:
"Ceci est une classe personne"
age = 10
def saluer(self):
print('Bonjour')
# Sortie : 10
print(Personne.age)
# Sortie : <function Personne.saluer>
print(Personne.saluer)
# Sortie : "Ceci est une classe personne"
print(Personne.__doc__)
Sortie
10 <function Personne.saluer at 0x7fc78c6e8160> Ceci est une classe personne
Créer un objet en Python
Les classes servent d'usines pour les objets. L'instanciation ressemble à un appel de fonction :
>>> harry = Personne()
L'objet résultant harry peut accéder aux attributs de classe via la notation point. Les méthodes de classe deviennent des méthodes liées sur l'instance.
class Personne:
"Ceci est une classe personne"
age = 10
def saluer(self):
print('Bonjour')
# créer un nouvel objet de la classe Personne
harry = Personne()
# Sortie : <function Personne.saluer>
print(Personne.saluer)
# Sortie : <bound method Personne.saluer of <__main__.Personne object>>
print(harry.saluer)
# Appel de la méthode saluer() de l'objet
# Sortie : Bonjour
harry.saluer()
Sortie
<function Personne.saluer at 0x7fd288e4e160> <bound method Personne.saluer of <__main__.Personne object at 0x7fd288e9fa30>> Bonjour
Remarquez le paramètre self dans les définitions de méthode. Quand une méthode est appelée sur une instance, Python passe automatiquement l'instance comme premier argument, permettant à harry.saluer() de s'exécuter sans fournir explicitement self.
Par convention, self est utilisé, bien que n'importe quel nom soit syntaxiquement valide. Suivre cette convention améliore la lisibilité et s'aligne avec les standards de la communauté.
Constructeurs en Python
Les méthodes spéciales préfixées par des doubles underscores jouent des rôles spéciaux. La méthode __init__, invoquée lors de l'instanciation, agit comme constructeur, initialisant l'état de l'instance.
class NombreComplexe:
def __init__(self, r=0, i=0):
self.reel = r
self.imag = i
def get_data(self):
print(f'{self.reel}+{self.imag}j')
# Créer un nouvel objet NombreComplexe
num1 = NombreComplexe(2, 3)
# Appeler la méthode get_data()
# Sortie : 2+3j
num1.get_data()
# Créer un autre objet NombreComplexe
# et ajouter un attribut dynamique 'attr'
num2 = NombreComplexe(5)
num2.attr = 10
# Sortie : (5, 0, 10)
print((num2.reel, num2.imag, num2.attr))
# Accéder à un attribut manquant lève une erreur
print(num1.attr)
Sortie
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'NombreComplexe' object has no attribute 'attr'
Cet exemple démontre que les attributs peuvent être ajoutés dynamiquement à des instances individuelles sans affecter les autres.
Supprimer des attributs et objets
Les attributs peuvent être supprimés avec l'instruction del. Supprimer la méthode ou l'attribut de classe affecte les appels subséquents.
>>> num1 = NombreComplexe(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last): ... AttributeError: 'NombreComplexe' object has no attribute 'imag'
>>> del NombreComplexe.get_data
>>> num1.get_data()
Traceback (most recent call last): ... AttributeError: 'NombreComplexe' object has no attribute 'get_data'
Les objets eux-mêmes peuvent être supprimés. Supprimer la référence libère le nom ; si aucune autre référence n'existe, l'objet est ramassé par le garbage collector automatiquement.
>>> c1 = NombreComplexe(1,3)
>>> del c1
>>> c1
Traceback (most recent call last): ... NameError: name 'c1' is not defined
En Python, la gestion de la mémoire est gérée par le comptage de références et un garbage collector cyclique, assurant un nettoyage efficace des ressources.

Python
- Classes et objets C# : Fondations pour une POO robuste
- Maîtriser les classes et méthodes abstraites C# : Guide pratique
- Comprendre les classes et méthodes partielles C#
- Maîtriser les classes et méthodes sealed en C# : Quand les utiliser, exemples clairs et sécurité du code
- Classes et objets C++ : Guide pratique de la programmation orientée objet
- Fonctions amies et classes amies en C++ : Maîtriser le contrôle d'accès
- Mots-clés et identifiants Python : Maîtriser les mots réservés et les conventions de nommage
- Instructions, indentation et commentaires en Python : Guide clair
- Maîtriser les opérations sur les répertoires et fichiers en Python