Résolue

Différence entre méthodes magiques et classiques en Python

# Méthodes # Classes

Bonjour ,

Ce que vous appelez une méthode "magique" , c'est une méthode qui se déclenche :
-soit automatiquement comme __init__

  • soit soit qui se déclenche à partir de l'instance d'un objet comme __str__

alors qu'une méthode classique se déclenche plutot
du genre moninstancedobjet.unemethodeX() # cad avec la syntaxe du "." et des parenthèses .

Aie je bien compris la différence entre les 2 type de méthode "magique" vs "classique" ?
Est-ce-qu'il existe des méthodes "magiques" qui se déclenchent par d'autres moyens que l'instance ou automatiquement ?

Bonjour,

Ce que tu nommes méthode magique, dans un cadre plus formel est appelé méthode spéciale.
En effet la méthode __init__() se déclenche dès l'appel à la classe. La méthode __str__ va quand à elle être appelée via un print(nom_classe()).
Il existe en effet d'autres méthodes spéciales qui se déclenchent de façon directes, comme la méthode __eq__. Par exemple:

class Comparaison:
    def __init__(self, valeur):
        self.valeur = valeur

    def __eq__(self, autre):
        return self.valeur == autre.valeur


a = Comparaison(10)
b = Comparaison(10)
print(a == b)  # Appelle __eq__, True

Comparativement la méthode de classe doit être appelée de façon explicite :

class Comparaison:
    def __init__(self, valeur):
        self.valeur = valeur

    def est_egal(self, autre):
        if not isinstance(autre, Comparaison):
            return False  # On vérifie que l'autre objet est de la même classe
        return self.valeur == autre.valeur


a = Comparaison(10)
b = Comparaison(10)
c = Comparaison(15)

# Comparaison explicite avec la méthode classique
print(a.est_egal(b))  # True
print(a.est_egal(c))  # False
print(a.est_egal(10))  # False, car 10 n'est pas une instance de Comparaison

Oui, tu as bien compris les différences entre les deux types de méthodes.

Ok merci ...

Thierry Chappuis

Mentor

Techniquement, une méthode spéciale peut être exécutée comme une méthode d'instance (pas de classe comme dit plus haut) classique.

a = Comaraison(10)

# est identique (mais plus lisible) que :

a = Comparaison.__new__(Comparaison)
a.__init__(10)

Mais comme ce sont des méthode spéciales, Python automatise leur appel. Ainsi, Comparaison() exécute automatiquement les méthodes __new__ et __init__ successivement.

La fonction print() fait-elle appel à la fonction str() qui exécute automatiquement la méthode __str__ de l'objet à afficher.

print(a == b)

# est transformé par Python en 

print(a.__eq__(b))

Pour une liste complète des méthodes spéciales, il y a la documentation officielle: https://docs.python.org/fr/3.13/reference/datamodel.html#special-method-names

Au fond, même si l'exécution de ces méthodes spéciales peut sembler magique, leur définition n'a finalement rien de ... spécial. Définir une méthode comme __eq__ est au final rigoureusement identique à définir une méthode d'instance est_egal.

Belle semaine

Thierry

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.