Включение как атрибут против метода - PullRequest
0 голосов
/ 02 февраля 2019

Во многих уроках Python для начинающих по ООП часто включаются методы, зависящие только от self.

Например, видео YouTube включает в себя этот пример:

class Employee:

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay
        self.email = first + '.' + last + '@company.com'

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

Что повлияет на решение включить что-то подобное в метод, а не в атрибут?

Например:

class Employee:

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay
        self.email = first + '.' + last + '@company.com'
        self.fullname = "{} {}".format(first, last)

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Использование fullname в качестве метода делает fullname «свойство» динамическим.Если вы измените имя и / или фамилию и позвоните fullname, он вернет ожидаемое полное имя.

В опубликованном вами коде не ясно, какова логика составления email.Если это строго «first.last@company.com», то имеет смысл также создать метод для него.С другой стороны, однако, электронная почта обычно предоставляется пользователем, поэтому изменение имен не обязательно означает изменение электронной почты.

Теперь, почему я поставил «свойство» в кавычках выше: Python (и многие другие языки)имеет понятие свойства .Таким образом, полное имя на самом деле является свойством, которое динамически состоит из первого и последнего.

0 голосов
/ 02 февраля 2019

Представьте себе следующее:

class Employee:
    def __init__(self, first, last):
        self.first = first
        self.last = last
        self.fullname = f'{first} {last}'

В результате:

>>> e = Employee('John', 'Smith')
>>> e.fullname
'John Smith'
>>> e.first = 'Pete'
>>> e.fullname
'John Smith'

, что означает, что полное имя не обновляется при изменении имени или фамилии.

Если вместо этого мы используем свойство:

class Employee:
    def __init__(self, first, last):
        self.first = first
        self.last = last

    @property
    def fullname(self):
        return f'{self.first} {self.last}'

Мы получим:

>>> e = Employee('John', 'Smith')
>>> e.fullname
'John Smith'
>>> e.first = 'Pete'
>>> e.fullname
'Pete Smith'

Как видите, полное имя будет обновляться всякий раз, когда обновляется имя или фамилия, и онине выйдет из синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...