Автор оригинала: Chris.
От обучения сотни тысяч студенты Python, я нашел эту ошибку, чтобы быть классическим. Я думаю Понимание классов достаточно трудно, но многие кодер, которые только что начали узнать о Python, правы путают 😖 о Типерр, который жалуется слишком мало позиционных аргументов. Давайте решим эту путаницу раз и навсегда, мы будем?
Формирование проблемы: метод принимает один аргументы, но два Даны
Рассмотрим следующий минимальный пример, где возникает эта ошибка. Большинство вхождений этой ошибки являются вариантами следующего использования – вы определяете метод с одним аргументом, но при вызове его одним аргументом Python поднимает ошибку:
class YourClass: def method(your_arg): # One positional argument defined print(your_arg) o = YourClass() o.method('finxter') # Calling it with one argument
Тем не менее, этот фрагмент кода поднимает ошибку: TypeError: метод () принимает 1 позиционный аргумент, но 2 были даны
Traceback (most recent call last): File "C:\Users\xcent\Desktop\code.py", line 6, ino.method('finxter') TypeError: method() takes 1 positional argument but 2 were given
Вот как это выглядит в моем холостом ходу:
Каково происхождение этой ошибки?
Решение: первый позиционный аргумент должен быть самостоятельно
Вы можете решить TypeError: Метод () занимает 1 позиционного аргумента, но 2 были даны
Добавив аргумент с именем Я
к вашему определению метода в качестве первого позиционного аргумента. Но при звонке, вы пропустите имя, так что вы определите Метод (я, arg)
Но звоните Метод (ARG)
. Python неявно передает ссылку на экземпляр в качестве первого аргумента метода, поэтому он дается вам, что два аргумента.
class YourClass: def method(self, your_arg): # One positional argument defined print(your_arg) o = YourClass() o.method('finxter') # Calling it with one argument
Теперь вывод не содержит ошибку:
finxter
Причина проста: первое ключевое слово является ссылкой на экземпляр, на котором он называется. Так, Если вы звоните
o.method('finxter')
Python автоматически преобразует его на
YourClass.method(o, 'finxter')
Передача экземпляра, на котором он называется первым позиционным аргументом, обычно называемым Я
Отказ Это просто синтаксический сахар, но вы должны понять его один раз, чтобы преодолеть свою путаницу навсегда.
Фон
Имя Я В соответствии с Конвенцией название первого аргумента метода класса Python. Переменная Я
Указывает на конкретный экземпляр, на котором называется метод. Он используется в способе доступа к атрибутам и другим методам того же экземпляра. Вызывающий абонент метода явно не передает экземпляр в себя, а покидает его интерпретатору Python, чтобы автоматически пройти его. Например, учитывая объект Автомобиль
Python автоматически преобразует метод вызова Car.Drive ()
к Драйв (Self = Car)
Отказ
Не стесняйтесь присоединиться к нашему сообществу амбициозных кодеров и скачать ваши чит-листы:
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Оригинал: “https://blog.finxter.com/solved-typeerror-method-takes-1-positional-argument-but-2-were-given/”