Dans ce deuxième épisode Ninja Python, je vous présente une introduction intuitive aux concepts de Classes, d’Objets, d’Héritage de classes et de Programmation Orienté Objet en Python.
Programmation Orienté Objet en Python
La Programmation Orienté Object ou POO est un modèle de langage de programmation dans lequel les programmes sont organisés en objets plutôt qu’en fonctions et en logique. Les classes et les objets sont des concepts de base de la Programmation Orientée Objet et nous allons les explorer en détail dans cet article.
Classe
Une classe est un modèle de création d’objets. Il fournit les propriétés (les données qu’aura l’objet – variables) et son comportement (les actions ou opérations que peut réaliser l’objet – méthodes).
Analogie
Pensez à une classe en tant que schéma ou plan d’une maison – ce n’est pas physiquement une vraie maison, mais une spécification de toutes les propriétés d’une maison – chambres, étages, surface, etc.
Définir une Classe
# Définition Classe class House: pass
Ce qu’il faut retenir d’une classe Python
- Elle est utilisée pour créer des types personnalisés.
- Le mot-clé class est utilisé pour définir une nouvelle classe
- Il définit la structure et le comportement des objets
- Par convention, un nom de classe est écrit en CamelCase (pratique qui consiste à écrire un ensemble de mots en les liant sans espace ni ponctuation, et en mettant en capitale la première lettre de chaque mot)
Objet
Un objet est une instance particulière de la classe. Deux objets différents d’une classe peuvent avoir des valeurs de propriétés différentes et sont (la plupart du temps) indépendants l’un de l’autre.
En prenant l’exemple de la classe House, s’il y a 2 objets de la classe House – ils peuvent avoir un nombre de pièces différentes, une superficie différente, une adresse différente, un nombre d’étages différent, etc. (Nous verrons cela plus tard avec le code).
Analogie
Pensez à un objet en tant qu’une maison physique réelle – construite conformément au plan d’architecte (Classe House) défini ci-dessus.
Créer un objet
# Créer un objet de la classe House en utilisant sont constructeur first_house = House() # Vérifier le type de l'objet créé type(first_house) # Sortie <class '__main__.House'>
Ce qu’il faut retenir d’un objet
- Les objets sont réels, ont un état et occupent de la mémoire
- Ils sont créés / instanciés à partir d’une spécification de classe et ne peuvent exister sans classe
- Il peut y avoir plusieurs objets d’une même classe, chacun aura ses propres propriétés
Méthodes d’instanciation
Ce sont les méthodes les plus communes dans les classes Python.
Ce sont des fonctions définies dans une classe qui sont appelées en utilisant des objets de cette classe.
Elles sont appelées méthodes d’instanciation car elles peuvent accéder aux données uniques d’une instance de classe spécifique (un objet).
Définition de la méthode d’instanciation dans une classe
class House: # definition de la méthode d'instanciantion def set_rooms(self, num_rooms): self.rooms = num_rooms # Créer une instance de la classe - création de la maison actuelle house_small = House() # Appeler une méthode d'instanciation pour l'instance/objet 'house_small' house_small.set_rooms(2) # Créer une autre instance house_big = House() house_big.set_rooms(5) print(f'Nombre de pièces dans la petite maison: {house_small.rooms}') print(f'Nombre de pièces dans la grande maison: {house_big.rooms}') # Sortie: # Nombre de pièces dans la petite maison: 2 # Nombre de pièces dans la grande maison: 5
Points à retenir sur les méthodes d’instance
- Elles sont appelées par des objets
- Elles doivent avoir self en premier paramètre
- self est un autre terme python. Nous pouvons utiliser self pour accéder à des données ou à d’autres méthodes d’instanciation de cette classe. Vous ne pouvez pas y accéder sans utiliser self
Réflexion : n’y-a-t-il pas plus de sens de spécifier le nombre de pièces d’une maison pendant la création de l’objet Maison au lieu de le faire plus tard ?
Voyons dans la section suivante comment nous pouvons le faire pour justement gagner du temps.
Méthode d’initialisation
C’est une méthode d’instanciation pour initialiser de nouveaux objets directement avec des valeurs pour les propriétés. Nous le définissons en utilisant le mot clé __init __().
Ajout de la méthode d’initialisation à notre classe
class House: # Initialisation def __init__(self, num_rooms): self.rooms = num_rooms # Créer une instance de la classe house_small = House(2) house_big = House(5) print(f'Nombre de pièces pour la petite maison: {house_small.rooms}') print(f'Nombre de pièces pour la grande maison: {house_big.rooms}') # Sortie: # Nombre de pièces pour la petite maison: 2 # Nombre de pièces pour la grande maison: 5
Notre solution est beaucoup plus claire, concise et efficace maintenant!
Ce qu’il faut retenir de la méthode d’initialisation
- Doit être définie par le mot-clé __init __()
(le double underscore est utilisé par l’exécuteur Python) - Le premier paramètre est self
- Si la méthode d’initialisation est présente, le constructeur appelle __init __()
Héritage
Il fait référence à la définition d’une nouvelle classe avec peu ou pas de modification d’une classe existante.
Une sous-classe est dérivée d’une classe de base, héritant de son comportement et rendant le comportement spécifique à la sous-classe.
Syntaxe
# Classe de base class BaseClass: Corps de la classe de base # Classe dérivée class DerivedClass(BaseClass): Corps de la classe dérivée
Pourquoi l’héritage ?
L’héritage permet à une classe dérivée d’hériter de toutes les fonctionnalités de sa classe de base, en lui ajoutant de nouvelles fonctionnalités. Cela entraîne la réutilisation du code.
Intuition
Pour mieux comprendre le concept, prenons un exemple de 2 types de maisons et créons une classe pour chacune d’elles :
class Apartment: ''' Un appartement : logement appartenant à un plus grand ensemble (immeuble) ''' def __init__(self, rooms, bathrooms, floor): self.rooms = rooms self.bathrooms = bathrooms self.floor = floor def room_details(self): print(f'Cette propriété a {self.rooms} pièces \ avec {self.bathrooms} salles de bain') class Bungalow: ''' Petite maison typique de plein pied ''' def __init__(self, rooms, bathrooms): self.rooms = rooms self.bathrooms = bathrooms def room_details(self): print(f'Cette propriété a {self.rooms} pièces \ avec {self.bathrooms} salles de bain')
Comme nous pouvons facilement le constater, les appartements et les bungalows sont des types d’habitation et présentent des propriétés communes (chambres, salles de bains) et une méthode en commun (détails du logement).
Actuellement, ces propriétés et méthodes communes sont dupliquées dans les deux classes, qui peuvent facilement être extraites afin d’être réutilisées. C’est ici que le concept d’héritage peut être utile.
Voyons comment créer une classe de base avec toutes les propriétés communes et la réutiliser dans les classes de base.
# Classe de base class House: ''' Un lieu qui fournit un abri pour se loger ''' def __init__(self, rooms, bathrooms): self.rooms = rooms self.bathrooms = bathrooms def room_details(self): print(f'Cette propriété a {self.rooms} pièces \ avec {self.bathrooms} salles de bain') class Apartment(House): ''' Un logement dans un grand bâtiment où les autres ont aussi leur propre logement ''' def __init__(self, rooms, bathrooms, floor): House.__init__(self, rooms, bathrooms) self.floor = floor class Bungalow(House): ''' Une petite maison typique ''' pass # Créer un appartement apartment = Apartment(2, 2, 21) apartment.room_details() # Créer un bungzalow bungalow = Bungalow(4, 3) bungalow.room_details() # Sortie: # Cette propriété a 2 pièces avec 2 salles de bain # Cette propriété a 4 pièces avec 3 salles de bain
Nous avons créé avec succès la classe de base House avec les propriétés communes.
Les classes Apartment et Bungalow sont désormais une extension de la classe House. Cela rend notre code plus propre, maintenable et réutilisable.
Conclusion – Programmation Orienté Objet en Python
Dans cet article, nous avons appris à utiliser les concepts de classes, d’objets et d’héritage pour utiliser la puissance de la Programmation Orientée Objet (POO).
Cela nous aide à encapsuler notre code dans des classes et à écrire un code propre, concis et maintenable.
Bien que les classes nous aident dans de nombreux cas d’utilisation à simplifier les choses, il ne faut pas en abuser – en particulier dans les cas plus simples où cela n’est pas nécessaire.
À lire aussi dans la collection Ninja Python :