@staticmethod
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
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte