Wenn ich eine Klasse habe ...
class MyClass:
def method(arg):
print(arg)
... mit dem ich ein Objekt erstelle ...
my_object = MyClass()
... auf die ich so nenne method("foo")
...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... warum sagt mir Python, dass ich zwei Argumente gegeben habe, obwohl ich nur eines gegeben habe?
self
. Das Deklarierendef method(arg):
ist für eine Methode falsch, sollte es auch seindef method(self, arg):
. Wenn der Methodenversand versucht,method(arg):
zwei Parameter aufzurufen und abzugleichenself, arg
, wird dieser Fehler angezeigt.Antworten:
In Python gilt Folgendes:
... ist syntaktischer Zucker , den der Dolmetscher hinter den Kulissen übersetzt in:
... was, wie Sie sehen, tatsächlich zwei Argumente hat - es ist nur so, dass das erste aus Sicht des Anrufers implizit ist.
Dies liegt daran, dass die meisten Methoden mit dem Objekt arbeiten, für das sie aufgerufen werden. Daher muss es eine Möglichkeit geben, auf dieses Objekt innerhalb der Methode zu verweisen. Konventionell wird dieses erste Argument
self
innerhalb der Methodendefinition aufgerufen :Wenn Sie
method("foo")
eine Instanz von aufrufenMyNewClass
, funktioniert dies wie erwartet:Gelegentlich (aber nicht oft) interessiert Sie das Objekt, an das Ihre Methode gebunden ist , wirklich nicht , und unter diesen Umständen können Sie die Methode mit der integrierten Funktion dekorieren , um Folgendes
staticmethod()
zu sagen:... in diesem Fall müssen Sie
self
der Methodendefinition kein Argument hinzufügen , und es funktioniert immer noch:quelle
self
als erstes Argument zur Methode löst das Problem.Noch etwas zu beachten, wenn diese Art von Fehler auftritt:
Ich bin auf diese Fehlermeldung gestoßen und fand diesen Beitrag hilfreich. Es stellte sich heraus, dass ich in meinem Fall eine
__init__()
Objektvererbung überschrieben hatte .Das geerbte Beispiel ist ziemlich lang, daher gehe ich zu einem einfacheren Beispiel über, bei dem keine Vererbung verwendet wird:
Ergebnis ist:
PyCharm hat diesen Tippfehler nicht verstanden. Notepad ++ auch nicht (andere Editoren / IDEs könnten).
Zugegeben, dies ist ein TypeError "nimmt keine Parameter". Er unterscheidet sich in Bezug auf die Objektinitialisierung in Python nicht wesentlich von "got two", wenn man einen erwartet.
Adressierung des Themas: Ein Überladungsinitialisierer wird verwendet, wenn er syntaktisch korrekt ist. Andernfalls wird er ignoriert und stattdessen der integrierte Initialisierer verwendet. Das Objekt wird dies nicht erwarten / behandeln und der Fehler wird ausgelöst.
Im Fall des Sytax-Fehlers: Das Update ist einfach. Bearbeiten Sie einfach die benutzerdefinierte init-Anweisung:
quelle
SyntaxError
. Der Code ist syntaktisch korrekt. Es definiert nur korrekt eine Methode mit dem Namen___init__
, die niemand jemals aufrufen wird, anstelle der speziellen Methode__init__
. Aus diesem Grund wird kein Fehler erkannt, da kein Fehler erkannt werden kann.In einfachen Worten.
In Python sollten Sie
self
allen definierten Methoden in Klassen Argumente als erstes Argument hinzufügen :Dann können Sie Ihre Methode entsprechend Ihrer Intuition anwenden:
Dies sollte dein Problem lösen :)
Zum besseren Verständnis können Sie auch die Antworten auf diese Frage lesen: Was ist der Zweck des Selbst?
quelle
Als Python-Neuling hatte ich dieses Problem, als ich die Python-
**
Funktion falsch verwendete. Der Versuch, diese Definition von irgendwoher aufzurufen:Die Verwendung eines Anrufs ohne Doppelstern verursachte das Problem:
Die Lösung besteht darin
**
, dem Argument Folgendes hinzuzufügen :quelle
*args
(/**kwargs
).Es tritt auf, wenn Sie nicht die Anzahl der Parameter angeben, nach denen die
__init__()
oder eine andere Methode sucht.Beispielsweise:
Wenn Sie das obige Programm ausführen, wird folgende Fehlermeldung angezeigt:
Wie können wir dieses Ding loswerden?
Übergeben Sie einfach die Parameter, nach welcher
__init__()
Methode gesucht wirdquelle
Sie sollten tatsächlich eine Klasse erstellen:
quelle
In meinem Fall habe ich vergessen, das hinzuzufügen
()
Ich habe die Methode so aufgerufen
Aber es sollte so sein
quelle
Übergeben Sie den
cls
Parameter@classmethod
an, um dieses Problem zu beheben.quelle