Les Méthodes Spéciales en Python

Les méthodes spéciales, ou méthodes magiques, sont des méthodes prédéfinies en Python avec un nom qui commence et se termine par un double souligné (par exemple, __init__, __str__, __add__).

Elles sont utilisées pour surcharger le comportement de base des opérations et des fonctions associées aux objets.

Méthode __init__

La méthode __init__(self) est le constructeur de base de tous les objets en Python. Elle est appelée lors de la création d'une instance d'une classe pour effectuer l'initialisation.

Exemple d'utilisation :

class Personne:
    def __init__(self, nom, age):
        self.nom = nom
        self.age = age

Méthodes __str__ et __repr__

La méthode __str__(self) est utilisée pour représenter l'objet sous forme de chaîne de caractères lorsqu'il est converti en une chaîne (par exemple, avec la fonction str() ou lors de l'impression avec print()).

La méthode __repr__(self) est utilisée pour obtenir une représentation "formelle" de l'objet, généralement utilisée pour le débogage par la fonction repr().

Exemple d'utilisation :

class Personne:
    def __init__(self, nom, age):
        self.nom = nom
        self.age = age

    def __str__(self):
        return self.nom + " "+ self.age +"ans"

    def __repr__(self):
        return "Personne({}, {})".format(self.nom,self.age)

Les méthodes __str__ et __repr__ sont utilisées pour la représentation textuelle d'un objet. Si elles ne sont pas surchargées dans une classe, Python utilise les implémentations par défaut de la classe object pour afficher l'objet.

Méthodes d'Opération Mathématique

Les méthodes spéciales d'opération mathématique permettent de personnaliser le comportement des opérateurs mathématiques tels que l'addition __add__, la soustraction __sub__, la multiplication __mul__, etc.

Exemple d'utilisation :

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

Méthode __eq__

La méthode __eq__(self,other) permet de personnaliser la comparaison d'égalité entre deux objets de la classe..

Exemple d'utilisation :

class Personne:
    def __init__(self, nom, age):
        self.nom = nom
        self.age = age

    def __eq__(self, other):
        return self.nom == other.nom and self.age == other.age

Méthode __len__

La méthode __len__ permet de personnaliser la manière dont la taille d'un objet est calculée.

Exemple d'utilisation :

Pour une classe de bibliothèque, vous pouvez surcharger la méthode __len__ pour renvoyer le nombre total de livres disponibles dans cette bibliothèque.

class Livre:
    def __init__(self, titre, auteur):
        self.titre = titre
        self.auteur = auteur

class Bibliotheque:
    def __init__(self):
        self.livres = []

    def ajouter_livre(self, livre):
        self.livres.append(livre)

    def __len__(self):
        return len(self.livres)

# Créez une instance de la classe Bibliotheque
ma_bibliotheque = Bibliotheque()

# Ajoutez des livres à la bibliothèque
livre1 = Livre("L'Alchimiste", "Paulo Coelho")
livre2 = Livre("1984", "George Orwell")
livre3 = Livre("Le Petit Prince", "Antoine de Saint-Exupéry")

ma_bibliotheque.ajouter_livre(livre1)
ma_bibliotheque.ajouter_livre(livre2)
ma_bibliotheque.ajouter_livre(livre3)

# Utilisation de la méthode __len__ pour obtenir le nombre de livres dans la bibliothèque
nombre_de_livres = len(ma_bibliotheque)

print("Nombre de livres dans la bibliothèque :", nombre_de_livres)

Exercices

  1. Créez une classe Vecteur qui représente des vecteurs en 2D avec des attributs x et y. La classe doit avoir une méthode spéciale __abs__ pour calculer la norme du vecteur.

Rappel : La fonction abs() appliquée à un vecteur en mathématiques (en particulier en géométrie) renvoie la norme du vecteur. La norme d'un vecteur est une mesure de sa longueur, c'est-à-dire la distance du point de départ (origine) au point d'extrémité (bout de la flèche) du vecteur.

Pour un vecteur bidimensionnel (x, y), la formule est la suivante :

Norme = √(x^2 + y^2)

Pour un vecteur tridimensionnel (x, y, z), la formule est étendue comme suit :

Norme = √(x^2 + y^2 + z^2)

Solution

import math

class Vecteur:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __abs__(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

# Exemple d'utilisation
v = Vecteur(3, 4)
norme = abs(v)

print("Norme du vecteur :",norme)

Conclusion

Les méthodes spéciales en Python permettent de personnaliser le comportement des objets de vos classes. Elles facilitent l'interaction avec ces objets et rendent votre code plus lisible et plus propre. En les utilisant correctement, vous pouvez concevoir des classes plus expressives et puissantes.