Ситуация: вы решили освоить мощь классов и попробовать ООП на Python. Делаете всё как по учебнику: сначала описываете класс, внутри него метод, а внутри метода — простую команду, которая пишет тестовое сообщение на экране:
# объявляем класс
class myClass():
# внутри класса объявляем метод
def myMethod():
# внутри метода пишем команду, которую будет выполнять наш метод
print('Это вызов метода внутри класса')
# создаём новый объект на основе класса
a = myClass()
# вызываем метод этого объекта
a.myMethod()
Кажется, что всё правильно, но при запуске появляется ошибка:
❌TypeError: myMethod() takes 0 positional arguments but 1 was given
Странно, ведь мы всё сделали всё как нужно.
Что это значит: Python обнаружил аргументы там, где их быть не должно. А раз аргументы есть и компилятор не знает, что с ними делать, то он останавливается и выдаёт эту ошибку.
Когда встречается: во всех случаях, когда мы указываем лишние аргументы или ставим их там, где они не нужны. Это необязательно будут ситуации из ООП — ошибка с аргументом может появиться в любой программе, где есть лишний аргумент.
Что делать с ошибкой TypeError: something() takes 0 positional arguments but 1 was given
Общее решение очевидно: нужно посмотреть на строку, на которую ругается Python, проверить в ней все аргументы и сверить их количество с тем, что должно быть по синтаксису.
Вот простой случай: проверяем условие, и если всё сходится — выводим все названия ключей из словаря:
if choice == "5":
print("Решение найдено:")
for i in dictionary:
print(dictionary.keys(i))
Здесь будет такая же ошибка, потому что у keys() не может быть аргументов — он сразу выводит список всех ключей словаря. Достаточно написать так, чтобы ошибка ушла:
if choice == "5":
print("Решение найдено:")
for i in dictionary:
print(dictionary[i])
В нашем случае с ООП проблема чуть хитрее: Python ругается на строку a.myMethod()
, у которой и так в описании нет никаких параметров. Но здесь дело в другом — вызов метода таким способом и есть ошибка. Объект почему-то не знает, что у него есть метод, который можно вызывать сам по себе, и воспринимает команду myMethod()
как лишний аргумент.
Всё из-за того, что мы в описании метода не поставили в качестве аргумента ключевое слово self
— оно как раз показывает, что этот метод можно вызывать снаружи. Добавим это, и ошибка исчезнет:
# объявляем класс
class myClass():
# внутри класса объявляем метод
def myMethod(self):
# внутри метода пишем команду, которую будет выполнять наш метод
print('Это вызов метода внутри класса')
# создаём новый объект на основе класса
a = myClass()
# вызываем метод этого объекта
a.myMethod()