“TypeError: method() nimmt 1 Positionsargument, aber 2 wurden angegeben”, aber ich habe nur eines übergeben

Lesezeit: 9 Minuten

Benutzeravatar von Zero Piraeus
Null Piräus

Wenn ich eine Klasse habe …

class MyClass:

    def method(arg):
        print(arg)

… die ich verwende, um ein Objekt zu erstellen …

my_object = MyClass()

… auf dem ich anrufe method("foo") wie so …

>>> 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 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.

    – smci

    2. Mai 2020 um 14:56 Uhr

Benutzeravatar von Zero Piraeus
Null Piräus

In Python dies:

my_object.method("foo")

… Ist syntethischer Zuckerdie der Dolmetscher hinter den Kulissen übersetzt in:

MyClass.method(my_object, "foo")

… 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:

>>> my_new_object = MyNewClass()
>>> my_new_object.method("foo")
<__main__.MyNewClass object at 0x29045d0>
foo

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:

>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo

  • Kurz gesagt: Hinzufügen self als erstes Argument für die Methode löst das Problem.

    – Amöbe

    10. Juni 2017 um 11:15 Uhr

  • oder fügen Sie einfach @staticmethod hinzu, bevor Sie es definieren. Cool

    – Ujjwal

    6. September 2020 um 6:38 Uhr

Benutzeravatar von simhumileco
simhumileco

In einfachen Worten

In Python sollten Sie hinzufügen self als erster Parameter für alle definierten Methoden in Klassen:

class MyClass:
  def method(self, arg):
    print(arg)

Dann können Sie Ihre Methode nach Ihrer Intuition anwenden:

>>> my_object = MyClass()
>>> my_object.method("foo")
foo

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

Jonrus Benutzeravatar
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


Benutzeravatar von Stanislav Pankevich
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:

def create_properties_frame(self, parent, **kwargs):

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)

Benutzeravatar von RtmY
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

wjandreas Benutzeravatar
wjandrea

Es tritt auf, wenn Sie die Anzahl der Parameter nicht angeben __init__() oder eine andere Methode suchen.

Zum Beispiel:

class Dog:
    def __init__(self):
        print("IN INIT METHOD")

    def __unicode__(self,):
        print("IN UNICODE METHOD")

    def __str__(self):
        print("IN STR METHOD")

obj = Dog("JIMMY", 1, 2, 3, "WOOF")

Wenn Sie das obige Programm ausführen, erhalten Sie einen Fehler wie diesen:

TypeError: __init__() takes 1 positional argument but 6 were given

Wie können wir dieses Ding loswerden?

Übergeben Sie einfach die Parameter, was __init__() Methode gesucht

class Dog:
    def __init__(self, dogname, dob_d, dob_m, dob_y, dogSpeakText):
        self.name_of_dog = dogname
        self.date_of_birth = dob_d
        self.month_of_birth = dob_m
        self.year_of_birth = dob_y
        self.sound_it_make = dogSpeakText

    def __unicode__(self, ):
        print("IN UNICODE METHOD")

    def __str__(self):
        print("IN STR METHOD")


obj = Dog("JIMMY", 1, 2, 3, "WOOF")
print(id(obj))

  • 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

Benutzeravatar von Manikandan Raju
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")

1443420cookie-check“TypeError: method() nimmt 1 Positionsargument, aber 2 wurden angegeben”, aber ich habe nur eines übergeben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy