Если у меня есть класс ...
class MyClass:
def method(arg):
print(arg)
... который я использую для создания объекта ...
my_object = MyClass()
... на котором я так называю method("foo")
...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... почему Python говорит мне, что я дал ему два аргумента, когда я дал только один?
self
. Таким образом, объявлениеdef method(arg):
неверно для метода, оно должно бытьdef method(self, arg):
. Когда диспетчер метода пытается вызватьmethod(arg):
и сопоставить два параметраself, arg
с ним, вы получаете эту ошибку.Ответы:
В Python это:
... это синтаксический сахар , который переводчик за кадром переводит на:
... который, как вы можете видеть, действительно имеет два аргумента - просто первый неявный, с точки зрения вызывающего.
Это связано с тем, что большинство методов выполняют некоторую работу с объектом, к которому они обращаются, поэтому должен быть какой-то способ для ссылки на этот объект внутри метода. По соглашению этот первый аргумент вызывается
self
внутри определения метода:Если вы вызываете
method("foo")
экземплярMyNewClass
, он работает как положено:Иногда (но не часто) вы действительно не заботитесь об объекте, с которым связан ваш метод, и в этом случае вы можете украсить метод встроенной
staticmethod()
функцией, чтобы сказать так:... в этом случае вам не нужно добавлять
self
аргумент в определение метода, и он все еще работает:источник
self
качестве первого аргумента метода решает проблему.Что-то еще, чтобы рассмотреть, когда встречается этот тип ошибки:
Я столкнулся с этим сообщением об ошибке и нашел этот пост полезным. Оказывается, в моем случае я переопределил,
__init__()
где было наследование объекта.Унаследованный пример довольно длинный, поэтому я перейду к более простому примеру, который не использует наследование:
Результат:
PyCharm не уловил эту опечатку. Также не Notepad ++ (другие редакторы / IDE могут).
Конечно, это TypeError типа «не принимает параметры», он мало чем отличается от «получил два» при ожидании единицы с точки зрения инициализации объекта в Python.
Обращаясь к теме: Инициализатор перегрузки будет использоваться, если синтаксически правильный, но если нет, он будет игнорироваться и вместо него будет использоваться встроенный. Объект не будет ожидать / обрабатывать это, и выдается ошибка.
В случае синтаксической ошибки: исправить это просто, просто отредактируйте пользовательский оператор init:
источник
SyntaxError
здесь. Код синтаксически правильный; он просто правильно определяет метод с именем___init__
, который никто не собирается вызывать, вместо специального метода__init__
. Вот почему ошибка не обнаружена, потому что ее нет.Простыми словами.
В Python вы должны добавить
self
аргумент в качестве первого аргумента для всех определенных методов в классах:Тогда вы можете использовать свой метод в соответствии с вашей интуицией:
Это должно решить вашу проблему :)
Для лучшего понимания вы также можете прочитать ответы на этот вопрос: какова цель самого себя?
источник
Новичок в Python, у меня была эта проблема, когда я
**
неправильно использовал функцию Python . Попытка вызвать это определение откуда-то:использование вызова без двойной звезды вызывало проблему:
Решение состоит в том, чтобы добавить
**
к аргументу:источник
*args
(/**kwargs
).Это происходит, когда вы не указываете ни одно из параметров, которое
__init__()
ищет какой-либо другой метод.Например:
Когда вы запускаете вышеуказанную программу, она выдает такую ошибку:
Как мы можем избавиться от этой вещи?
Просто передайте параметры, какой
__init__()
метод ищетеисточник
Вы должны создать класс:
источник
В моем случае я забыл добавить
()
Я вызывал такой метод
Но так и должно быть
источник
Передайте
cls
параметр в,@classmethod
чтобы решить эту проблему.источник