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ée Objet en Python.

Programmation Orientée Objet en Python

La Programmation Orientée 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.

Devenir Ninja Python - Programmation Orientée Objet
Classe House – juste un plan

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érents, 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.

Devenir Ninja Python - Programmation Orientée Objet
Une maison – Instance / objet de la classe House

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’instanciant 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 pe,ndant 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 communs sont dupliqués 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

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.

A lire aussi dans la collection Ninja Python: