Différence entre méthodes magiques et classiques en Python
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.
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 !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte