web-dev-qa-db-fra.com

Avons-nous vraiment besoin de @staticmethod decorator en python pour déclarer une méthode statique

Je suis curieux de savoir pourquoi nous avons besoin du décorateur @staticmethod pour déclarer la méthode en tant que static. J'étais en train de lire sur les méthodes statiques en Python et j'ai appris que la méthode statique peut être appelée sans instancier sa classe . J'ai donc essayé les deux exemples ci-dessous, mais les deux font la même chose:

class StatMethod:
  def stat():
    print("without Decorator")

class StatMethod_with_decorator:
  @staticmethod
  def stat():
    print("With Decorator")

Si j'appelle directement la méthode stat() sur la classe, les deux valeurs sont affichées/affichées:

>> StatMethod.stat()
without Decorator
>> StatMethod_with_decorator.stat()
With Decorator
8
Sanjay

Vous avez besoin du décorateur si vous souhaitez appeler le @staticmethod à partir de l'instance de la classe au lieu de la classe directement

class Foo():
    def bar(x):
        return x + 5

>>> f = Foo()
>>> f.bar(4)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    f.bar(4)
TypeError: bar() takes 1 positional argument but 2 were given

Maintenant, si je déclare @staticmethod, l'argument self n'est pas passé implicitement comme premier argument

class Foo():
    @staticmethod
    def bar(x):
        return x + 5

>>> f = Foo()
>>> f.bar(4)
9
27
CoryKramer

La documentation décrit certaines transformations effectuées lors de l'appel d'une méthode définie par l'utilisateur:

Notez que la transformation d'objet fonction en objet méthode (non lié ou lié) se produit chaque fois que l'attribut est extrait de la classe ou l'instance. Dans certains cas, une optimisation fructueuse consiste à attribuez l'attribut à une variable locale et appelez cette variable locale . Notez également que cette transformation ne se produit que pour les fonctions; les autres objets appelables (et tous les objets non appelables) sont récupéré sans transformation. Il est également important de noter que Les fonctions définies par l'utilisateur qui sont des attributs d'une instance de classe sont non converti en méthodes liées; cela ne se produit que lorsque la fonction est un attribut de la classe.

Pour les méthodes marquées comme méthode statique, cela est différent:

Les objets méthode statique fournissent un moyen de neutraliser la transformation de les objets de fonction aux objets de méthode décrits ci-dessus. Une méthode statique objet est un wrapper autour de tout autre objet, généralement un .__ défini par l'utilisateur. objet de méthode. Lorsqu'un objet de méthode statique est extrait d'une classe ou une instance de classe, l'objet renvoyé est le .__ enroulé. objet, qui n'est soumis à aucune transformation ultérieure. Statique Les objets de méthode ne sont pas eux-mêmes appelables, bien que les objets qu'ils wrap sont généralement. Les objets de méthode statiques sont créés par le .__ intégré. staticmethod () constructeur.

2
Flurin

si la fonction a certains paramètres, alors l'appel d'une méthode non statique échouera

et la méthode statique n'a pas utilisé les variables locales dans la classe, mais la méthode de la classe sera

1
Jimmy Guo