Si j'ai une classe ...
class MyClass:
def method(arg):
print(arg)
... que j'utilise pour créer un objet ...
my_object = MyClass()
... sur laquelle j'appelle method("foo")
comme ça ...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... pourquoi Python me dit que je lui ai donné deux arguments, alors que je n'en ai donné qu'un?
self
. Donc, déclarerdef method(arg):
est faux pour une méthode, ça devrait l'êtredef method(self, arg):
. Lorsque la méthode dispatch essaie d'appelermethod(arg):
et de faire correspondre deux paramètresself, arg
avec elle, vous obtenez cette erreur.Réponses:
En Python, ceci:
... est du sucre syntaxique , que l'interprète traduit dans les coulisses en:
... qui, comme vous pouvez le voir, a en effet deux arguments - c'est juste que le premier est implicite, du point de vue de l'appelant.
En effet, la plupart des méthodes fonctionnent avec l'objet auquel elles sont appelées, il doit donc y avoir un moyen de faire référence à cet objet à l'intérieur de la méthode. Par convention, ce premier argument est appelé
self
dans la définition de la méthode:Si vous appelez
method("foo")
une instance deMyNewClass
, cela fonctionne comme prévu:Parfois (mais pas souvent), vous ne vous souciez pas vraiment de l'objet auquel votre méthode est liée, et dans ce cas, vous pouvez décorer la méthode avec la
staticmethod()
fonction intégrée pour le dire:... dans ce cas, vous n'avez pas besoin d'ajouter un
self
argument à la définition de la méthode, et cela fonctionne toujours:la source
self
comme premier argument à la méthode résout le problème.Autre chose à considérer lorsque ce type d'erreur se produit:
Je rencontrais ce message d'erreur et j'ai trouvé ce message utile. Il s'avère que dans mon cas, j'avais remplacé un
__init__()
héritage d'objets.L'exemple hérité est assez long, je vais donc passer à un exemple plus simple qui n'utilise pas l'héritage:
Le résultat est:
PyCharm n'a pas saisi cette faute de frappe. Notepad ++ non plus (d'autres éditeurs / IDE pourraient le faire).
Certes, il s'agit d'un typeError "ne prend aucun paramètre", ce n'est pas très différent de "got two" quand on en attend un, en termes d'initialisation d'objet en Python.
Aborder le sujet: un initialiseur de surcharge sera utilisé s'il est syntaxiquement correct, mais sinon il sera ignoré et le intégré sera utilisé à la place. L'objet ne s'attend pas / ne gère pas cela et l'erreur est levée.
Dans le cas de l'erreur sytax: Le correctif est simple, il suffit de modifier l'instruction init personnalisée:
la source
SyntaxError
ici. Le code est syntaxiquement correct; il définit juste correctement une méthode nommée___init__
, que personne ne va jamais appeler, au lieu de la méthode spéciale__init__
. C'est pourquoi aucune erreur n'est détectée, car il n'y en a pas à détecter.En termes simples.
En Python, vous devez ajouter l'
self
argument comme premier argument à toutes les méthodes définies dans les classes:Ensuite, vous pouvez utiliser votre méthode selon votre intuition:
Cela devrait résoudre votre problème :)
Pour une meilleure compréhension, vous pouvez également lire les réponses à cette question: quel est le but de soi?
la source
Nouveau venu sur Python, j'ai eu ce problème lorsque j'utilisais la fonctionnalité de Python de
**
manière incorrecte. Essayer d'appeler cette définition quelque part:l'utilisation d'un appel sans double étoile était à l'origine du problème:
La solution est d'ajouter
**
à l'argument:la source
*args
(/**kwargs
).Cela se produit lorsque vous ne spécifiez pas le nombre de paramètres que la
__init__()
ou toute autre méthode recherche.Par exemple:
Lorsque vous exécutez le programme ci-dessus, il vous donne une erreur comme celle-ci:
Comment pouvons-nous nous débarrasser de cette chose?
Passez simplement les paramètres, quelle
__init__()
méthode recherchezla source
Vous devez réellement créer une classe:
la source
Dans mon cas, j'ai oublié d'ajouter le
()
J'appelais la méthode comme ça
Mais ça devrait être comme ça
la source
Passez le
cls
paramètre dans@classmethod
pour résoudre ce problème.la source