web-dev-qa-db-fra.com

Classes statiques en Python

Une fois, j’ai lu (je pense sur une page de Microsoft) que c’est un bon moyen d’utiliser des classes statiques lorsque vous n’AVEZ PAS BESOIN de deux instances d’une classe.

J'écris un programme en Python. Est-ce un mauvais style si j'utilise @classmethod pour chaque méthode d'une classe?

24
rynd

D'après mon expérience, la création d'un cours est une très bonne solution pour plusieurs raisons. La première est que vous finissez par utiliser la classe en tant que classe «normale» (en particulier pour créer plus d'une instance) plus souvent que vous ne le pensez. C'est aussi un choix de style raisonnable de s'en tenir à des cours pour tous; cela peut faciliter la tâche aux autres personnes qui lisent/maintiennent votre code, en particulier si elles sont très OO - elles seront à l'aise avec les classes. Comme indiqué dans d'autres réponses, il est également raisonnable de n'utiliser que des fonctions "nues" pour la mise en œuvre. Vous voudrez peut-être commencer avec une classe et en faire un motif singleton/Borg (beaucoup d'exemples si vous cherchez sur Google); cela vous donne la possibilité de (ré) utiliser la classe pour répondre à d'autres besoins. Je recommanderais par contre l’approche de la classe statique, qui est non conventionnelle et non pythonique, ce qui rend la lecture et la maintenance plus difficiles.

7
Art Swri

Généralement, une telle utilisation est préférable en utilisant simplement des fonctions dans un module, sans classe.

30
Gareth Latty

C'est un style terrible, sauf si vous avez réellement besoin d'accéder à la classe.

Une méthode statique [...] ne se traduit pas en méthode de classe Python. Bien sûr, il en résulte plus ou moins le même effet, mais l'objectif d'une méthode de classe est de faire quelque chose qui n'est généralement pas possible [...] (comme hériter d'un constructeur autre que celui par défaut). La traduction idiomatique d'une méthode [...] statique est généralement une fonction au niveau du module, pas une méthode de classe ou une méthode statique.

la source

14

Il existe quelques approches que vous pourriez prendre pour cela. Comme d'autres l'ont mentionné, vous pouvez simplement utiliser des fonctions au niveau du module. Dans ce cas, le module lui-même est l'espace de noms qui les maintient ensemble. Une autre option, qui peut être utile si vous devez suivre l'état, consiste à définir une classe avec des méthodes normales (prendre soi-même), puis à en définir une instance globale et à copier ses méthodes d'instance dans l'espace de noms du module. C'est l'approche adoptée par le module "random" de la bibliothèque standard - jetez un oeil à lib/python2.5/random.py dans votre répertoire python. Au bas, il y a quelque chose comme ça:

# Create one instance, seeded from current time, and export its methods
# as module-level functions.  [...]
_inst = Random()
seed = _inst.seed
random = _inst.random
uniform = _inst.uniform
...

Ou vous pouvez adopter l'approche de base que vous avez décrite (bien que je vous recommande d'utiliser @staticmethod plutôt que @classmethod dans la plupart des cas).

6
Edward Loper

Vous voudrez peut-être une classe singleton plutôt qu'une classe statique: Création d’une classe singleton en python

0
Tom Bull