@staticmethod

Une méthode qui ne reçoit automatiquement ni l’objet ni la classe. Elle se comporte comme une fonction ordinaire placée dans une classe.

Sur cette page

Exemple

#
Python
class Grade:
    def __init__(self, points):
        if not Grade.is_valid(points):
            raise ValueError("Les points doivent être compris entre 0 et 100")
        self.points = points

    @staticmethod
    def is_valid(points):
        return 0 <= points <= 100

    @staticmethod
    def to_percent(points, maximum):
        return round(points / maximum * 100)

print(Grade.is_valid(85), Grade.is_valid(120))
print(Grade.to_percent(18, 24))
print(list(filter(Grade.is_valid, [85, 120, -5, 64])))
print(Grade(72).is_valid(50))
Résultatrésultat enregistré, vous pouvez le vérifier
True False
75
[85, 64]
True

Définition et utilisation

#

Le décorateur @staticmethod crée une méthode statique : une fonction qui appartient à la classe, mais qui ne reçoit automatiquement aucun premier argument. Elle n’a ni self ni cls, donc elle n’a pas non plus accès aux attributs de l’objet ou de la classe, sauf si vous les lui passez explicitement.

Vous appelez une méthode statique via la classe (Grade.is_valid(72)) ou via un objet, et le résultat ne dépend que des arguments. Elle sert aux fonctions utilitaires qui appartiennent logiquement à la classe, par exemple une validation ou un calcul, mais qui n’ont pas besoin de ses données. Les placer dans la classe regroupe du code lié et facilite sa recherche.

Si une fonction utilitaire n’est liée à aucune classe, mieux vaut généralement la laisser comme une fonction ordinaire dans le module. Quand une méthode doit créer des objets de la classe ou utiliser ses attributs, c’est @classmethod qu’il vous faut.

Syntaxe

#
Syntaxe
class Nom:
    @staticmethod
    def méthode(arguments):
        ...

Nom.méthode(arguments)

Plus d’exemples

#
Trois types de méthodes dans une classe
Python
class Course:
    count = 0

    def __init__(self, title):
        self.title = title
        Course.count += 1

    def describe(self):
        return f"Cours {self.title}"

    @classmethod
    def total(cls):
        return f"Cours : {cls.count}"

    @staticmethod
    def slugify(title):
        return title.lower().replace(" ", "-")

python = Course("Python depuis zéro")
print(python.describe())
print(Course.total())
print(Course.slugify("Python depuis zéro"))
Résultatrésultat enregistré, vous pouvez le vérifier
Cours Python depuis zéro
Cours : 1
python-depuis-zéro

Une méthode ordinaire reçoit l’objet (self), une méthode de classe reçoit la classe (cls), et une méthode statique reçoit seulement ce que vous lui passez.

Bonnes pratiques

#
  • Si une méthode n’utilise pas self, demandez-vous si elle ne devrait pas être statique, voire sortir complètement de la classe.
  • Appelez plutôt une méthode statique par le nom de la classe. On voit ainsi immédiatement qu’elle ne dépend pas de l’état d’un objet.
  • Les méthodes statiques sont faciles à tester, car leur résultat ne dépend que des arguments.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.