Résolue

@staticmethod

# Fonctions # Méthodes # Orienté objet

Gabriel Trouvé

Mentor

Bonsoir,

Petite question sur les @staticmethode


Je viens de réussir l'exercice passwd generator.

Mon script ressemble presque à celui de Thibault sauf que je détaille tout donc plus de lignes...

Mais ma question porte sur le @staticmethod. Je ne l'avais pas mis à la base dans mon script. Mais mon script fonctionne qd même sans. Alors est-ce obligatoire ? Ou c'est surtout indicatif ?

Et je pensais que les @staticmethod c'était surtout pour utiliser une méthode à laquelle on ne passe pas de paramètre.


Mais j'ai du mal comprendre.

Quand est-ce que l'on utilise le staticmethod ?


Merci d'avance


PS : perso on pourra se faire une petite partie mentora sur les class ? lol. J'ai pas mal compris mais ça permettra de revenir dessus.



import string
import random


class PasswordGenerator:


    @staticmethod
    def generate(taille):
        
        letters = string.ascii_letters
        numbers = string.digits
        conca = letters + numbers
        password = "".join(random.sample(conca, taille))
        return password


mot_de_passe = PasswordGenerator.generate(15)

Salut,


alors non ce n'est pas nécessaire mais c'est extrêmement recommandé. Si tu définis une méthode statique sans la déclarer avec le décorateur déjà premièrement, ça rendra ton code beaucoup moins lisible. L'intérêt de définir une staticmethod est de pouvoir l'utiliser sans avoir à instancier un objet. Au lieu de faire :


mon_objet = MyClass()
mon_objet.my_method()


Tu peux donc directement faire


MyClass.my_method()


ainsi ta méthode n'est pas lié à un objet et ne pourra pas modifier les attributs de ton objets.


Effectivement, tu peux définir une méthode statique dans une classe sans le décorateur @staticmethod

l'ennui c'est que si l'envie te vient de vouloir utiliser cette méthode finalement sur un objet instancié et bien là tu ne pourras plus. Cf exemple ci dessous:


In [1]: import string
  ...: import random
  ...: 
  ...: 
  ...: class PasswordGenerator:
  ...:   def generate(taille):
  ...: 
  ...:     letters = string.ascii_letters
  ...:     numbers = string.digits
  ...:     conca = letters + numbers
  ...:     password = "".join(random.sample(conca, taille))
  ...:     return password

In [2]: PasswordGenerator.generate(15)
Out[2]: 'COgrHtsGnh4dL2I'

In [3]: password_object = PasswordGenerator()

In [4]: password_object.generate(15)
---------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
Input In [4], in <module>
----> 1 password_object.generate(15)

TypeError: generate() takes 1 positional argument but 2 were given


C'est en tout cas le problème auquel moi j'ai déjà été confronté avec les staticmethod peut être qu'il y a d'autres raisons à utiliser le @staticmethod (je crois aussi qu'il y une histoire de performance mais je n'ai jamais creusé).


Mais déjà saches que la lisibilité c'est déjà un bon argument =D Au moins on comprend direct que c'est une méthode statique et qu'elle a sa place dans ta Class

Gabriel Trouvé

Mentor

D'accord merci PA. Va falloir que je relise ça plusieurs fois pour bien comprendre. Mais c'est un peu plus clair.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.