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 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.
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.