TypeError: methode() prend 1 de position argument, mais 2 ont été donnés
Si j'ai une classe ...
class MyClass:
def method(arg):
print(arg)
... que j'utilise pour créer un objet ...
my_object = MyClass()
... sur lequel j'appelle method("foo")
comme si ...
>>> 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 dire, je lui ai donné deux arguments, quand j'ai seulement donné un?
Vous devez vous connecter pour publier un commentaire.
En Python, c':
... est sucre syntaxique, qui l'interprète traduit derrière les scènes dans:
... qui, comme vous pouvez le voir, n'ont, en effet, deux arguments - c'est juste que le premier est implicite, du point de vue de l'appelant.
C'est parce que la plupart des méthodes de travail avec l'objet qu'ils sont appelés, si il doit y avoir un moyen pour que cet objet puisse être appelé à l'intérieur de la méthode. Par convention, ce premier argument est appelé
self
à l'intérieur de la définition de la méthode:Si vous appelez
method("foo")
sur une instance deMyNewClass
, il fonctionne comme prévu:Parfois (mais pas souvent), vous avez vraiment ne pas de soins sur l'objet que votre méthode est liée à, et dans ce cas, vous pouvez décorer la méthode avec le groupe builtin
staticmethod()
fonction de le dire:... dans ce cas, vous n'avez pas besoin d'ajouter un
self
argument de la définition de la méthode, et il fonctionne toujours:self
comme premier argument de la méthode résout le problème.Autre chose à considérer lors de ce type d'erreur est rencontrée:
J'ai été en cours d'exécution dans ce message d'erreur et a trouvé ce message utile. S'avère que dans mon cas, j'avais remplacé un init() où il a été l'objet de l'héritage.
Hérité exemple, c'est assez long, je vais donc passer à un autre plus simple exemple de ne pas utiliser l'héritage:
Résultat est:
PyCharm n'a pas attraper cette faute de frappe. Ni Notepad++ (d'autres éditeurs/IDE peut).
Accordé, c'est un "ne prend pas de paramètres" TypeError, il n'est pas beaucoup différent de "a deux" lorsque attend, dans les termes de l'initialisation de l'objet en Python.
Sur le thème: Une surcharge de l'initialiseur sera utilisé si la syntaxe est correcte, mais si non il sera ignoré et le haut-utilisé à la place. L'objet ne s'attendent/gérer le présent et l'erreur est levée.
Dans le cas de la sytax erreur: La solution est simple, il suffit de modifier la coutume instruction init:
SyntaxError
ici. Le code est syntaxiquement correcte, il a juste correctement définit une méthode nommée___init__
, dont personne n'est jamais à l'appel, au lieu de la méthode spéciale__init__
. C'est pourquoi aucune erreur n'est détectée—car il n'existe pas de détecter.Il se produit lorsque vous ne spécifiez pas le pas de paramètres, la
__init__()
ou de toute autre méthode de recherche.Par exemple:
Lorsque vous exécutez le programme ci-dessus, il vous donne une erreur comme ça:
La façon dont nous pouvons nous débarrasser de cette chose?
Vient de passer les paramètres, ce qui
__init__()
méthode de recherche deDans des mots simples.
En Python, vous devez ajouter
self
argument comme premier argument à toutes les méthodes définies dans les classes:Ensuite, vous pouvez utiliser votre méthode de travail 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 l'auto?
De nouveaux arrivants de Python, j'ai eu ce problème quand j'utilise le Python
**
fonctionnalité dans un mauvais sens. Essayez d'appeler cette définition de quelque part:l'aide d'un appel sans une étoile double est à l'origine du problème:
La solution est d'ajouter ** à l'argument:
Passer
cls
paramètre dans@classmethod
pour résoudre ce problème.