0Pricing
Python Academy · Leçon

@classmethod et @staticmethod

Définissez des méthodes de classe et des méthodes statiques avec les décorateurs appropriés.

@classmethod et @staticmethod est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.

Introduction

@classmethod reçoit la classe comme premier argument. @staticmethod ne reçoit aucun argument spécial. Les deux sont définis dans la classe.

Instance, classe et statique

Les méthodes ordinaires reçoivent self. Les méthodes de classe reçoivent cls. Les méthodes statiques ne reçoivent ni l’un ni l’autre. Choisissez selon les données dont vous avez besoin.
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

@classmethod comme fabrique

L’usage le plus courant concerne les constructeurs alternatifs. Date.from_string('2024-01-15') évite d’effectuer l’analyse dans __init__.
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

@classmethod avec héritage

Dans une méthode de classe, cls désigne la sous-classe réelle, et non la classe de base. Les méthodes fabrique fonctionnent ainsi correctement avec les sous-classes.
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

@staticmethod pour les utilitaires

Les méthodes statiques sont des fonctions ordinaires regroupées logiquement avec une classe. Elles ne peuvent accéder ni aux données de la classe ni à celles de l’instance.
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

@staticmethod ou fonction de module

Si une fonction n’a pas besoin de la classe, elle pourrait être une fonction au niveau du module. Utilisez @staticmethod uniquement lorsqu’elle appartient logiquement à la classe.
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

Appel depuis une instance

Vous pouvez appeler @classmethod et @staticmethod sur des instances, mais le comportement de cls et l’absence de premier argument restent inchangés.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

Méthode de classe pour les singletons

Les méthodes de classe peuvent imposer des modèles singleton en vérifiant si une instance existe déjà.
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

Redéfinition des méthodes de classe

Une sous-classe peut redéfinir une méthode de classe. cls désignera alors la sous-classe, ce qui préserve le polymorphisme.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

Vérification du type avec cls

Dans une méthode de classe, cls désigne la classe réelle. Utilisez cls() pour créer des instances : ne codez pas en dur le nom de la classe.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

Combinaison avec @property

Une valeur mise en cache au niveau de la classe peut combiner @classmethod et un attribut de classe pour mettre en cache des données communes à toute la classe.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

Vérification rapide

Que représente cls dans une @classmethod ?

Récapitulatif

@classmethod reçoit cls : utilisez-le pour les fabriques, les constructeurs alternatifs et les singletons. @staticmethod ne reçoit rien de particulier : utilisez-le pour les utilitaires. cls désigne la classe réelle (ou la sous-classe).

Continuez

Vos progrès sont excellents ! Continuez pour maîtriser le prochain concept.

Questions Fréquemment Posées

La leçon « @classmethod et @staticmethod » est-elle gratuite ?

Oui — le texte complet de « @classmethod et @staticmethod » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « @classmethod et @staticmethod » ?

Définissez des méthodes de classe et des méthodes statiques avec les décorateurs appropriés. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Python Academy ?

Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « @classmethod et @staticmethod » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?

Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Les fonctions comme objets de première classe
  2. Écrire des décorateurs personnalisés
  3. Le décorateur @property
  4. @classmethod et @staticmethod
← Retour à Python Academy