Le tuto présent sur OC dit à propos des méthodes spéciales : "Les méthodes spéciales permettent d'influencer la manière dont Python accède aux attributs d'une instance et réagit à certains opérateurs ou conversions."
Ok d'accord si on veut. Mais en soit, je peux faire la même chose avec une méthode standard dans mon objet, que ce soit getter/setter/comparaison ou autre. Je ne comprends donc pas trop l'interet de ce type de méthode, si quelqu'un peut m'éclairer.
Car si je prend l'exemple du getter, soit j'aurais une property si j'ai besoin d'une encapsulation, soit je m'en fiche et je fais direct objet.attribut en dehors de ma classe pour y avoir accès.
En fait les méthodes spéciales sont appelées implicitement. Par exemple lors d'une multiplication (__mul__), d'une addition (__add__), ... Tu les utilises constamment s'en t'en rendre compte .
Avec une méthode standard, tu es obligé d'appeler la méthode explicitement (ou de faire un truc compliqué pour ne pas le faire). Et puis (c'est à approfondir) à mon avis ça sert énormément pour faire du duck typing (i.e. on se fout de la classe, ce qui nous intéresse c'est de savoir si l'objet dispose de la méthode). Mais bon là je disgresse vers quelque chose que je maîtrise peu
Alors je comprends bien que certaines de ces méthodes spéciales sont présente dans l'objet "object" et qu'elles sont appelées indirectement, mais pour reformuler, quelle utilité de les surcharger ? Ca revient au même de le faire dans une méthode standard.
Les méthodes spéciales d'accès aux attributs ne sont qu'une petite partie des méthodes spéciales. De mon point de vu aussi, leur utilité se limite à la méta-programmation (vaste sujet), mais ne trouve, à priori, aucun intérêt en dehors de ce contexte particulier.
En revanche, les accesseurs, qui ne sont pas des méthodes spéciales, sont utilisés pour limiter et contrôler la manière d'avoir, de modifier et de supprimer des données.
class Person:
def __init__(self, name, age, ...):
...
@property # getter
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise TypeError("'age' must be an integer")
elif value < 0:
raise ValueError("'age' must be null or positive")
self._age = value
Ca revient au même de le faire dans une méthode standard.
Ça revient au même oui, mais comme le souligne oldP tu gardes un comportement naturel. Imaginons que tu implémentes une classe Date. De cette classe, tu aimerais pouvoir additionner 2 instances. Tu ferais plutôt date1.addition(date2) ou plus naturellement date1 + date2? Le résultat sera le même, mais tu as gagné en confort
Précepte: Le mieux est l'ennemi du bien
Les méthodes spéciales, utilité ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.