Позиционные аргументы и ключевое слово self - PullRequest
0 голосов
/ 04 июля 2018
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 в методе полного имени, поэтому я получаю:

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())

и некоторые другие вещи, такие как исключение себя из оператора return в fullname(). Тем не менее, каждый метод изменения говорит, что ошибка TypeError. Так что я в замешательстве, почему fullname() передается аргумент?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

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

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

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

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

0 голосов
/ 04 июля 2018

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

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

self будет ссылаться на emp. Таким образом, вы должны передать self в качестве аргумента fullname.

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

0 голосов
/ 04 июля 2018

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

def fullname(self):
    [...]

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

...