class Employee:
def __init__(self, first, last):
self.first = first
self.last = last
def fullname():
return '{} {}'.format(self.first, self.last)
emp = Employee('Rob', 'M')
print (emp.fullname())
Вы заметите, что я оставил ключевое слово self
в методе fullname, поэтому я получаю:
TypeError: fullname() takes 0 positional arguments but 1 was given
Это на самом деле ошибка аргументов? Мое предположение было не так, я попробовал:
class Employee:
def __init__(foo, first, last):
foo.first = first
foo.last = last
def fullname():
return '{} {}'.format(self.first, self.last)
emp = Employee('rob', 'm')
print(emp.fullname())
и несколько других вещей, таких как отказ от вывода из возвращаемого выражения в fullname()
. Тем не менее, каждый метод изменения говорит, что ошибка является TypeError
. Итак, я в тупике, почему fullname()
передается в аргумент?
Рассмотрим следующее:
def fullname():
return '{} {}'.format(self.first, self.last)
В предыдущем методе, что означает сама переменная self
в self.first
? Как Python знает, что вы имеете в виду при вводе self
?
Все методы неявно передают родительский объект в качестве своего первого параметра, так же как sys.argv[0]
всегда является именем скрипта. Это такие вещи, как self.first
может работать.
Попробуйте определить его как:
def fullname(self):
[...]
Параметр self
неявно передается в вызовы методов. Он представляет ссылку на объект, на который был вызван метод.
В python первый аргумент метода класса относится к текущему экземпляру класса. Например, если вы создаете объект emp с использованием класса Employee:
emp = Employee('Rob', 'M')
self
будет ссылаться на emp. Поэтому вы должны передать self
как аргумент fullname
.
def fullname(self): return '{} {}'.format(self.first, self.last)
self
. (Кроме того, при публикации кода убедитесь, что он точно соответствует тому, что вы действительно выполняли, включая отступы. Это можно сделать, скопировав код в поле вопроса, выбрав все, что вы вставили (включая части, которые кажутся нормальными в предварительном просмотре) и нажав Ctrl-K.)