Coś innego, co należy wziąć pod uwagę przy napotkaniu tego rodzaju błędu:
Napotkałem ten komunikat o błędzie i uznałem ten post za pomocny. Okazuje się, że w moim przypadku zastąpiłem __init__()
dziedziczenie obiektów.
Dziedziczony przykład jest raczej długi, więc przejdę do prostszego przykładu, który nie korzysta z dziedziczenia:
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")
Wynik to:
<__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 nie złapał tej literówki. Notepad ++ też (inne edytory / IDE mogą).
To prawda, TypeError „nie przyjmuje parametrów”, nie różni się niczym od „dostania dwóch”, gdy oczekuje się jednego, pod względem inicjalizacji obiektu w Pythonie.
Zajmując się tym tematem: Inicjator przeciążenia zostanie użyty, jeśli jest poprawny pod względem składniowym, ale jeśli nie, zostanie zignorowany i zamiast tego zostanie użyty wbudowany. Obiekt nie oczekuje / nie obsłuży tego, a błąd zostanie zgłoszony.
W przypadku błędu sytax: Poprawka jest prosta, wystarczy edytować niestandardową instrukcję init:
def __init__(self, name):
self.name = name
self
. Dlatego deklarowaniedef method(arg):
jest niewłaściwe dla metody, powinno byćdef method(self, arg):
. Gdy metoda wysyłki próbuje wywołaćmethod(arg):
i dopasować do niego dwa parametryself, arg
, pojawia się ten błąd.