… warum sagt mir Python, dass ich ihm zwei Argumente gegeben habe, wenn ich nur eines gegeben habe?
Diese Nachricht hat zig Ursachen; Der spezifische Grund hier ist, dass alle Instanzmethoden ein erstes Argument erwarten, das wir standardmäßig aufrufen self. Also deklarieren def method(arg): ist falsch für eine Methode, sollte es sein def method(self, arg):. Wenn die Methode Dispatch versucht, aufzurufen method(arg): und passen Sie zwei Parameter an self, arg dagegen erhalten Sie diesen Fehler.
… was, wie Sie sehen, tatsächlich zwei Argumente hat – nur das erste ist aus Sicht des Aufrufers implizit.
Dies liegt daran, dass die meisten Methoden mit dem Objekt arbeiten, für das sie aufgerufen werden, sodass es eine Möglichkeit geben muss, auf dieses Objekt innerhalb der Methode zu verweisen. Per Konvention wird dieses erste Argument aufgerufen self innerhalb der Methodendefinition:
class MyNewClass:
def method(self, arg):
print(self)
print(arg)
Wenn Sie anrufen method("foo") auf eine Instanz von MyNewClasses funktioniert wie erwartet:
Gelegentlich (aber nicht oft), wirklich nicht kümmern Sie sich um das Objekt, an das Ihre Methode gebunden ist, und unter diesen Umständen können Sie es schmücken die Methode mit dem eingebauten staticmethod() Funktion, um das zu sagen:
class MyOtherClass:
@staticmethod
def method(arg):
print(arg)
… in diesem Fall müssen Sie kein a hinzufügen self Argument für die Methodendefinition, und es funktioniert immer noch:
Zum besseren Verständnis können Sie auch die Antworten auf diese Frage lesen: Was ist der Zweck des Selbst?
Was ist falsch an dieser Antwort? Warum hat ihr jemand einen negativen Punkt gegeben? Schließlich ist es die Antwort auf die Frage und zeichnet sich durch seine Einfachheit gegenüber anderen Antworten aus, was für manche Menschen, die nach einer Antwort suchen, wichtig sein kann. Ist es nicht?
– simhumileco
8. August 2019 um 21:53 Uhr
Es ist falsch zu sagen, dass Sie hinzufügen sollten self Argument zu ALLE definierte Methoden in Klassen. Im obigen Beispiel gibt es keine Verwendung für self innerhalb der Methode, daher kann sie dekoriert werden @staticmethod was wiederum nicht erfordern würde, dass Sie eine Instanz der Klasse erstellen. Hier kannst du mehr darüber lesen: docs.python.org/3/library/…
– Grafen
27. Mai 2022 um 12:30 Uhr
Es ist auch möglich zu haben @classmethodSdie nehmen cls als erster Parameter nicht self.
– wjandrea
15. November 2022 um 18:16 Uhr
Jonru
Etwas anderes zu beachten, wenn diese Art von Fehler auftritt:
Ich bin auf diese Fehlermeldung gestoßen und fand diesen Beitrag hilfreich. In meinem Fall stellte sich heraus, dass ich eine überschrieben hatte __init__() wo es Objektvererbung gab.
Das geerbte Beispiel ist ziemlich lang, daher gehe ich zu einem einfacheren Beispiel über, das keine Vererbung verwendet:
class MyBadInitClass:
def ___init__(self, name):
self.name = name
def name_foo(self, arg):
print(self)
print(arg)
print("My name is", self.name)
class MyNewClass:
def new_foo(self, arg):
print(self)
print(arg)
my_new_object = MyNewClass()
my_new_object.new_foo("NewFoo")
my_bad_init_object = MyBadInitClass(name="Test Name")
my_bad_init_object.name_foo("name foo")
Ergebnis ist:
<__main__.MyNewClass object at 0x033C48D0>
NewFoo
Traceback (most recent call last):
File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in <module>
my_bad_init_object = MyBadInitClass(name="Test Name")
TypeError: object() takes no parameters
PyCharm hat diesen Tippfehler nicht erkannt. Notepad ++ auch nicht (andere Editoren/IDEs könnten).
Zugegeben, dies ist ein “nimmt keine Parameter” TypeError, es ist nicht viel anders als “hat zwei”, wenn man einen erwartet, in Bezug auf die Objektinitialisierung in Python.
Adressierung des Themas: Ein überladender Initialisierer wird verwendet, wenn er syntaktisch korrekt ist, aber wenn nicht, wird er ignoriert und stattdessen der eingebaute verwendet. Das Objekt wird dies nicht erwarten/behandeln und der Fehler wird ausgegeben.
Im Falle des Syntaxfehlers: Die Lösung ist einfach, bearbeiten Sie einfach die benutzerdefinierte Init-Anweisung:
def __init__(self, name):
self.name = name
Da ist kein SyntaxError Hier. Der Code ist syntaktisch korrekt; Es definiert nur eine Methode mit dem Namen korrekt ___init__die niemand jemals aufrufen wird, anstelle der speziellen Methode __init__. Deshalb wird kein Fehler erkannt – weil es keinen zu erkennen gibt.
– Abart
27. Juni 2018 um 21:29 Uhr
Mir ist genau das gleiche passiert, aber mit __int__(self, ...):. Vergeudete Stunden wegen dieses Tippfehlers.
– anonym
5. September 2022 um 20:02 Uhr
Ich freue mich, dass Sie eine Lösung gefunden haben, aber dies ist ein völlig anderes Problem als das in der Frage. Ich würde sagen, Sie könnten Ihre eigene Frage stellen, aber das Gleiche wurde bereits gepostet, zum Beispiel: Fehler “Dieser Konstruktor akzeptiert keine Argumente”. __init__ (Tippfehler war _init_).
– wjandrea
15. November 2022 um 18:36 Uhr
Stanislaw Pankewitsch
Neuling in Python, ich hatte dieses Problem, als ich die Pythons benutzte ** Funktion auf eine falsche Weise. Der Versuch, diese Definition von irgendwoher aufzurufen:
Die Verwendung eines Anrufs ohne Doppelstern verursachte das Problem:
self.create_properties_frame(frame, kw_gsp)
TypeError: create_properties_frame() akzeptiert 2 Positionsargumente, aber 3 wurden angegeben
Die Lösung ist hinzuzufügen ** zum Argument:
self.create_properties_frame(frame, **kw_gsp)
RtmY
Wie in anderen Antworten erwähnt, müssen Sie übergeben, wenn Sie eine Instanzmethode verwenden self als erstes Argument – das ist die Fehlerquelle.
Darüber hinaus ist es wichtig zu verstehen, dass nur Instanzmethoden verwendet werden self als erstes Argument, um auf die Instanz zu verweisen.
Falls die Methode ist Statisch du passierst nicht selfaber ein cls Argument statt (bzw class_).
Bitte sehen Sie sich unten ein Beispiel an.
class City:
country = "USA" # This is a class level attribute which will be shared across all instances (and not created PER instance)
def __init__(self, name, location, population):
self.name = name
self.location = location
self.population = population
# This is an instance method which takes self as the first argument to refer to the instance
def print_population(self, some_nice_sentence_prefix):
print(some_nice_sentence_prefix +" In " +self.name + " lives " +self.population + " people!")
# This is a static (class) method which is marked with the @classmethod attribute
# All class methods must take a class argument as first param. The convention is to name is "cls" but class_ is also ok
@classmethod
def change_country(cls, new_country):
cls.country = new_country
Einige Tests nur um die Dinge klarer zu machen:
# Populate objects
city1 = City("New York", "East", "18,804,000")
city2 = City("Los Angeles", "West", "10,118,800")
#1) Use the instance method: No need to pass "self" - it is passed as the city1 instance
city1.print_population("Did You Know?") # Prints: Did You Know? In New York lives 18,804,000 people!
#2.A) Use the static method in the object
city2.change_country("Canada")
#2.B) Will be reflected in all objects
print("city1.country=",city1.country) # Prints Canada
print("city2.country=",city2.country) # Prints Canada
Diese Terminologie ist falsch. classmethodS Und staticmethodS sind zwei verschiedene dinge. classmethodEinsatz cls während staticmethods haben keine erforderlichen Parameter.
– wjandrea
15. November 2022 um 18:25 Uhr
Ich denke auch nicht, dass dies ein gutes Beispiel für a ist classmethoddenn warum willst du einen City Beispiel, um alle anderen zu beeinflussen? Wie, warum tut die City Klasse haben sogar eine country Attribut überhaupt? Sollte nicht jeder City Instanz sein eigenes Land definieren? Angenommen, ich wollte eine machen City Beispiel für Tokio und ein anderes für Toronto; das ist damit nicht möglich, also wie ist es nützlich? Hier ist ein besseres Beispiel, einschließlich a staticmethod.
– wjandrea
15. November 2022 um 18:28 Uhr
Danke @wjandrea, ich bin mir nicht 100% sicher, ob ich deine Kommentare verstanden habe und warum meine Antwort in irgendeiner Weise falsche Informationen liefert.
– RtmY
15. November 2022 um 19:35 Uhr
wjandrea
Es tritt auf, wenn Sie die Anzahl der Parameter nicht angeben __init__() oder eine andere Methode suchen.
Diese Terminologie ist falsch. classmethodS Und staticmethodS sind zwei verschiedene dinge. classmethodEinsatz cls während staticmethods haben keine erforderlichen Parameter.
– wjandrea
15. November 2022 um 18:25 Uhr
Ich denke auch nicht, dass dies ein gutes Beispiel für a ist classmethoddenn warum willst du einen City Beispiel, um alle anderen zu beeinflussen? Wie, warum tut die City Klasse haben sogar eine country Attribut überhaupt? Sollte nicht jeder City Instanz sein eigenes Land definieren? Angenommen, ich wollte eine machen City Beispiel für Tokio und ein anderes für Toronto; das ist damit nicht möglich, also wie ist es nützlich? Hier ist ein besseres Beispiel, einschließlich a staticmethod.
– wjandrea
15. November 2022 um 18:28 Uhr
Danke @wjandrea, ich bin mir nicht 100% sicher, ob ich deine Kommentare verstanden habe und warum meine Antwort in irgendeiner Weise falsche Informationen liefert.
– RtmY
15. November 2022 um 19:35 Uhr
Manikandan Raju
Wenn Sie die Methode aufrufen möchten, ohne ein Objekt zu erstellen, können Sie die Methode in eine statische Methode ändern.
class MyClass:
@staticmethod
def method(arg):
print(arg)
MyClass.method("i am a static method")
14434200cookie-check“TypeError: method() nimmt 1 Positionsargument, aber 2 wurden angegeben”, aber ich habe nur eines übergebenyes
Diese Nachricht hat zig Ursachen; Der spezifische Grund hier ist, dass alle Instanzmethoden ein erstes Argument erwarten, das wir standardmäßig aufrufen
self
. Also deklarierendef method(arg):
ist falsch für eine Methode, sollte es seindef method(self, arg):
. Wenn die Methode Dispatch versucht, aufzurufenmethod(arg):
und passen Sie zwei Parameter anself, arg
dagegen erhalten Sie diesen Fehler.– smci
2. Mai 2020 um 14:56 Uhr