Что-то еще, чтобы рассмотреть, когда встречается этот тип ошибки:
Я столкнулся с этим сообщением об ошибке и нашел этот пост полезным. Оказывается, в моем случае я переопределил, __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 не уловил эту опечатку. Также не Notepad ++ (другие редакторы / IDE могут).
Конечно, это TypeError типа «не принимает параметры», он мало чем отличается от «получил два» при ожидании единицы с точки зрения инициализации объекта в Python.
Обращаясь к теме: Инициализатор перегрузки будет использоваться, если синтаксически правильный, но если нет, он будет игнорироваться и вместо него будет использоваться встроенный. Объект не будет ожидать / обрабатывать это, и выдается ошибка.
В случае синтаксической ошибки: исправить это просто, просто отредактируйте пользовательский оператор init:
def __init__(self, name):
self.name = name
self
. Таким образом, объявлениеdef method(arg):
неверно для метода, оно должно бытьdef method(self, arg):
. Когда диспетчер метода пытается вызватьmethod(arg):
и сопоставить два параметраself, arg
с ним, вы получаете эту ошибку.