31 votes

Y a-t-il une raison de se donner une valeur par défaut?

J'ai été la navigation à travers un peu de code, et j'ai remarqué une ligne qui a attiré mon attention. Le code est similaire à l'exemple ci-dessous

class MyClass:
    def __init__(self):
        pass

    def call_me(self=''):
        print(self)

Cela ressemble à aucune autre classe que j'ai vu, mais un str est transmis comme valeur par défaut pour self.

Si j'ai imprimer self, il se comporte comme normal

>>> MyClass().call_me()
<__main__.MyClass object at 0x000002A12E7CA908>

Cela a été m'énerve et je ne peux pas comprendre pourquoi ce serait utilisée. Est-il une raison pour laquelle une str exemple serait passée comme une valeur par défaut pour self?

28voto

Jim Points 8793

Pas vraiment, c'est juste une étrange façon de le faire de ne pas générer une erreur lorsqu'elle est appelée par la classe:

MyClass.call_me()

fonctionne très bien, puisque, même si rien n'est implicitement passé comme avec les instances, la valeur par défaut de cet argument est fourni. Si aucune valeur par défaut n'a été fournie, lorsqu'il est appelé, ce serait bien sûr augmenter le TypeError pour les arguments que nous aimons tous. Quant à savoir pourquoi il a choisi une chaîne vide comme valeur, seul lui le sait.

Ligne de fond, ce qui est plus déroutant que cela est pratique. Si vous avez besoin de faire quelque chose de similaire, je serais d'avis d'un simple staticmethod avec un argument par défaut pour obtenir un effet similaire.

De cette façon, vous n'avez pas de souche de personne la lecture de votre code (comme le développeur qui a écrit cela n'a avec vous ;-):

@staticmethod
def call_me(a=''):
    print(a)

Si, au contraire, vous avez besoin d'accéder à des attributs de classe, vous pouvez toujours opter pour l' classmethod décorateur. Ces deux (class et static décorateurs) aussi servir un but secondaire de rendre votre intention claire pour d'autres la lecture de votre code.

13voto

Dmitry Torba Points 1517

La réponse courte est oui. De cette façon, vous pouvez appeler la fonction comme:

MyClass.call_me()

sans instanciation MyClass, qui imprime une chaîne vide.

Pour donner une réponse plus élaborée, nous avons besoin de regarder ce qui se passe derrière les coulisses.

Lorsque vous créez une instance de la classe, __new__ et __init__ sont appelés à créer, c'est:

a = MyClass()

est à peu près équivalent à:

a = MyClass.__new__(MyClass)
MyClass.__init__(a)

Chaque fois que vous utilisez une méthode sur une instance créée a:

a.call_me()

Il est "remplacé" avec MyClass.call_me(a).

Ainsi, ayant un paramètre par défaut pour l' call_me vous permet d'appeler cette fonction n'est pas seulement une méthode d'une instance, auquel cas self est une instance elle-même, mais aussi comme une méthode de classe statique.

De cette façon, au lieu de MyClass.call_me(a), juste MyClass.call_me() est appelé. Parce que la liste d'arguments est vide, l'argument par défaut est attribué self et le résultat souhaité (chaîne vide) est imprimé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X