it-swarm.com.de

TypeError: method () akzeptiert 1 Positionsargument, aber 2 wurden angegeben

Wenn ich eine Klasse habe ...

class MyClass:

    def method(arg):
        print(arg)

... mit dem ich ein Objekt erstelle ...

my_object = MyClass()

... auf die ich method("foo") wie folgt aufrufe ...

>>> 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 angegeben habe, obwohl ich nur eines angegeben habe?

186
Zero Piraeus

In Python ist dies:

my_object.method("foo")

... ist syntaktischer Zucker , was der Interpreter hinter den Kulissen übersetzt in:

MyClass.method(my_object, "foo")

... was, wie Sie sehen, in der Tat 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 wurden. Daher muss es eine Möglichkeit geben, auf das Objekt innerhalb der Methode zu verweisen. Konventionell heißt dieses erste Argument in der Methodendefinition self:

class MyNewClass:

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

Wenn Sie method("foo") für eine Instanz von MyNewClass aufrufen, funktioniert dies wie erwartet:

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

Gelegentlich (aber nicht oft) interessiert Sie das Objekt, an das Ihre Methode gebunden ist, nicht , und unter diesen Umständen können Sie - dekorieren die Methode mit der eingebauten staticmethod() Funktion, um dies zu sagen:

class MyOtherClass:

    @staticmethod
    def method(arg):
        print(arg)

... in diesem Fall müssen Sie der Methodendefinition kein Argument self hinzufügen, und es funktioniert immer noch:

>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo
264
Zero Piraeus

Noch etwas zu beachten, wenn dieser Fehlertyp auftritt:

Ich bin auf diese Fehlermeldung gestoßen und fand diesen Beitrag hilfreich. Es stellte sich heraus, dass ich in meinem Fall ein init () überschrieben hatte, bei dem es eine 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 verstanden. Notepad ++ auch nicht (andere Editoren/IDE's könnten).

Zugegeben, dies ist ein TypeError, der sich in Bezug auf die Objektinitialisierung in Python nicht wesentlich von "got two" unterscheidet, wenn man einen erwartet.

Behandeln des Themas: Ein Überladungsinitialisierer wird verwendet, wenn die Syntax korrekt ist. Wenn dies nicht der Fall ist, wird er ignoriert und stattdessen das integrierte verwendet. Das Objekt wird dies nicht erwarten/behandeln und der Fehler wird ausgelöst.

Im Fall des SysTax-Fehlers: Das Update ist einfach. Bearbeiten Sie einfach die benutzerdefinierte Init-Anweisung:

def __init__(self, name):
    self.name = name
11
Jonru2016

Es tritt auf, wenn Sie keine der Parameter angeben, nach denen __init__() oder eine andere Methode sucht.

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, wird ein Fehler wie der folgende angezeigt:

TypeError: __init __ () nimmt 1 Positionsargument an, aber 6 wurden angegeben

Wie können wir dieses Ding loswerden?

Übergeben Sie einfach die Parameter, nach welcher __init__() Methode gesucht wird

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))
6
Trinadh Koya

Als Python-Neuling hatte ich dieses Problem, als ich die Funktion ** von Python falsch verwendete. 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 () benötigt 2 Positionsargumente, aber 3 wurden angegeben

Die Lösung besteht darin, dem Argument ** hinzuzufügen:

self.create_properties_frame(frame, **kw_gsp)
2