Позиционные аргументы и ключевое слово self

1
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() передается в аргумент?

  • 0
    Вы забыли self . (Кроме того, при публикации кода убедитесь, что он точно соответствует тому, что вы действительно выполняли, включая отступы. Это можно сделать, скопировав код в поле вопроса, выбрав все, что вы вставили (включая части, которые кажутся нормальными в предварительном просмотре) и нажав Ctrl-K.)
  • 0
    В форме, в которой вы разместили ее, ваш код содержал несколько ошибок, связанных с отступами, которые могли привести к ошибке, отличной от той, о которой вы сообщили.
Показать ещё 1 комментарий
Теги:
python-3.x

3 ответа

1
Лучший ответ

Рассмотрим следующее:

def fullname():
    return '{} {}'.format(self.first, self.last)

В предыдущем методе, что означает сама переменная self в self.first? Как Python знает, что вы имеете в виду при вводе self?

Все методы неявно передают родительский объект в качестве своего первого параметра, так же как sys.argv[0] всегда является именем скрипта. Это такие вещи, как self.first может работать.

  • 0
    Значит, полное имя (self) ожидает экземпляр объекта? Который в этом случае является emp. Таким образом, позиционный аргумент, на который он ссылается, является фактическим экземпляром самого Employee?
  • 0
    @ Роб да, точно.
1

Попробуйте определить его как:

def fullname(self):
    [...]

Параметр self неявно передается в вызовы методов. Он представляет ссылку на объект, на который был вызван метод.

0

В python первый аргумент метода класса относится к текущему экземпляру класса. Например, если вы создаете объект emp с использованием класса Employee:

emp = Employee('Rob', 'M')

self будет ссылаться на emp. Поэтому вы должны передать self как аргумент fullname.

def fullname(self): return '{} {}'.format(self.first, self.last)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню