@staticmethod vs fonction au niveau du module

21

Il ne s'agit pas de @staticmethodet @classmethod! Je sais comment ça staticmethodmarche. Ce que je veux savoir, c'est les cas d'utilisation appropriés pour @staticmethodune fonction de niveau module.

J'ai googlé cette question, et il semble qu'il y ait un accord général sur le fait que les fonctions au niveau du module sont préférées aux méthodes statiques car elles sont plus pythoniques. Les méthodes statiques ont l'avantage d'être liées à sa classe, ce qui peut avoir du sens si seulement cette classe l'utilise. Cependant, en Python, la fonctionnalité est généralement organisée par module et non par classe, donc en faire une fonction de module est également logique.

Les méthodes statiques peuvent également être remplacées par des sous-classes, ce qui est un avantage ou un inconvénient selon la façon dont vous les regardez. Bien que les méthodes statiques soient généralement "fonctionnellement pures", le remplacer peut ne pas être intelligent, mais cela peut parfois être pratique (bien que cela puisse être l'une de ces choses "pratiques, mais NE LE FAITES JAMAIS", seule l'expérience peut vous apprendre).

Existe-t-il une règle générale pour l'utilisation des fonctions de méthode statique ou de niveau module? Quels avantages ou inconvénients concrets présentent-ils (par exemple extension future, extension externe, lisibilité)? Si possible, fournissez également un exemple de cas.

darkfeline
la source

Réponses:

11

Techniquement, une méthode statique et une fonction de module se comportent à peu près de manière identique - dans les deux cas, elles fonctionnent comme des fonctions standard, la différence étant l'espace de noms où elles sont placées. La décision est donc davantage une question de maintenabilité / lisibilité.

En général, j'utiliserais une méthode statique si certains ou tous ces critères sont remplis:

  • Il existe déjà une classe avec des méthodes normales
  • La fonction concerne les objets de la classe en général, mais pas une instance spécifique
  • Vous souhaitez pouvoir appeler la méthode comme s'il s'agissait d'une méthode non statique, peut-être parce que vous souhaiterez peut-être rendre la méthode non statique à l'avenir sans casser le code client
Michael Slade
la source
0

Un programme est une simulation d'un morceau de réalité. De cette façon, cela dépend de la façon dont vous percevez la réalité.

Une fonction représente une certaine activité. Plus l'activité est générale, plus la tendance à simuler l'activité avec une fonction est grande. Les méthodes sont liées aux classes. Plus l'activité est spécifique à la classe, plus elle a tendance à être simulée par une méthode.

Pensez aux fonctions trigonométriques. Dites, le sin()est si bien connu que vous savez qu'il correspond aux angles. Vous savez qu'il veut un nombre flottant en entrée et renvoie le flottant. Quoi qu'il en soit, il peut y avoir un type de données d'angle représenté par une classe et l' .sin()argument sans pourrait être une méthode normale qui fonctionne avec l'objet angle, et .sin(x)avec un seul argument pourrait être une méthode statique de la classe. Je pourrais parier que plus de gens pensent qu'il vaut mieux faire sin()une fonction simple. Ils sont plus habitués.

Autre point de vue : un module ressemble à une instance de classe. Il a ses propres variables membres et fonctions membres. Dans un certain sens, il implémente un modèle singleton. Chaque fois que vous l'importez à partir d'un autre module de l'application, vous avez accès exactement aux mêmes variables et fonctions.

pepr
la source
0

J'ai une fonction qui prendra une partie de la hiérarchie des données profondes d'un objet comme argument. Il serait fastidieux de transmettre les différents arguments nécessaires pour accéder à cette partie de la hiérarchie des données. N'ayez donc aucune raison de faire référence à soi ou à cls. Mais la fonctionnalité ne sera utilisée que sur des parties d'objets d'une classe particulière. Cela me semble donc une méthode de classe.

De plus, je préfère importer le nom de la classe («à partir de la classe d'importation de module» plutôt que «module d'importation»). L'inclusion de la fonction en tant que méthode statique me donne accès à la méthode tandis que l'écrire en tant que fonction au niveau du module nécessiterait une importation différente.

DVD Avins
la source
2
Si j'étais vous, j'éviterais de répondre à la première personne. C'est confu. Vous devriez plutôt écrire la deuxième personne au demandeur.
Aaron Hall
Peut-être. Je fournissais un exemple d'utilisation, qui peut ou non correspondre à ce que le demandeur avait en tête.
Dvd Avins