ProgrammationDéveloppeur Python

Expliquez la différence entre une méthode de classe (@classmethod), une méthode statique (@staticmethod) et une méthode d'instance ordinaire en Python. Quand et quoi choisir ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

  • Méthode d'instance ordinaire — reçoit comme premier argument self, c'est-à-dire une référence à un objet spécifique. Elle est utilisée pour accéder/modifier l'état de l'objet.
  • @classmethod reçoit comme premier argument cls — une référence à la classe elle-même, et non à un objet. Elle est utilisée pour les méthodes de fabrication ou les méthodes travaillant avec la classe dans son ensemble.
  • @staticmethod ne reçoit pas d'arguments implicites. C'est une fonction ordinaire placée dans l'espace de noms de la classe — pour un groupement logique.

Exemple :

class MyClass: def instance_method(self): print(f"Instance : {self}") @classmethod def class_method(cls): print(f"Classe : {cls.__name__}") @staticmethod def static_method(): print("Simple fonction") obj = MyClass() obj.instance_method() # self — c'est obj MyClass.class_method() # cls — c'est MyClass MyClass.static_method() # pas de self/cls

Question piège.

Question fréquente :

Peut-on appeler une méthode de classe via une instance ? En quoi cela diffère-t-il d'un appel via la classe elle-même ?

Réponse : Oui, une méthode de classe peut être appelée à la fois via une instance et via la classe elle-même. Peu importe d'où provient l'appel — le premier argument sera toujours la classe, et non l'instance. Lors de l'appel via une instance, sa classe est passée comme cls.

Exemples d'erreurs réelles dues à une méconnaissance des nuances du sujet.


Histoire

Dans le projet, toutes les méthodes de fabrication ont été faites statiques (@staticmethod), mais à l'intérieur, il fallait connaître le nom de la classe dérivée — cela s'est révélé impossible. Ils ont corrigé en @classmethod pour obtenir une référence à cls.


Histoire

Pour générer des identifiants uniques pour les instances, ils ont utilisé une méthode ordinaire (self), alors qu'il fallait utiliser une méthode de classe, car le compteur doit être commun à la classe, et non à chaque objet.


Histoire

Un développeur a placé une logique métier, non liée à la classe, dans une méthode statique à l'intérieur de la classe. D'autres n'ont pas pu trouver cette fonction, car ils ne s'attendaient pas à la voir dans l'espace d'une autre classe, ce qui a compliqué la maintenance.