Qualcos'altro da considerare quando si incontra questo tipo di errore:
Mi sono imbattuto in questo messaggio di errore e ho trovato utile questo post. Risulta che nel mio caso avevo scavalcato un luogo in __init__()
cui c'era l'ereditarietà degli oggetti.
L'esempio ereditato è piuttosto lungo, quindi passerò a un esempio più semplice che non utilizza l'ereditarietà:
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")
Il risultato è:
<__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 non ha riscontrato questo errore di battitura. Né Notepad ++ (altri editor / IDE potrebbero).
Certo, si tratta di un TypeError "non accetta parametri", non è molto diverso da "ottenerne due" quando ne prevede uno, in termini di inizializzazione dell'oggetto in Python.
Affrontare l'argomento: un inizializzatore di sovraccarico verrà utilizzato se sintatticamente corretto, ma in caso contrario verrà ignorato e verrà invece utilizzato il built-in. L'oggetto non si aspetta / gestisce questo e viene generato l'errore.
Nel caso dell'errore sytax: la correzione è semplice, basta modificare l'istruzione init personalizzata:
def __init__(self, name):
self.name = name
self
. Quindi dichiararedef method(arg):
è sbagliato per un metodo, dovrebbe esseredef method(self, arg):
. Quando il metodo di invio tenta di richiamaremethod(arg):
e abbinare due parametriself, arg
contro di esso, si ottiene quell'errore.