Ще щось, що слід враховувати, коли виникає такий тип помилок:
Я зіткнувся з цим повідомленням про помилку і вважав цю публікацію корисною. Виявляється, в моєму випадку я змінив місце, __init__()
де було спадкування об'єкта.
Спадковий приклад досить довгий, тому я перейду до більш простого прикладу, який не використовує успадкування:
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")
Результат:
<__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 не вловив цю помилку. Також Блокнот ++ (інші редактори / IDE не могли).
Зрозуміло, що це "не приймає параметрів" TypeError, він не сильно відрізняється, ніж "отримав два", коли очікує одного, з точки зору ініціалізації об'єкта в Python.
Звернення до теми: Якщо синтаксично правильно, буде використаний ініціалізатор перевантаження, але якщо ні, то він буде ігнорований, а замість цього вбудований. Об'єкт цього не очікує / не впорається, і помилка викидається.
У випадку помилки синтаксису: виправлення просте, просто відредагуйте спеціальний оператор init:
def __init__(self, name):
self.name = name
self
. Отже, декларуванняdef method(arg):
є неправильним для методу, воно повинно бутиdef method(self, arg):
. Коли диспетчер методу намагається викликатиmethod(arg):
і співставити два параметриself, arg
проти нього, ви отримуєте цю помилку.