чтобы передать аргумент self суперклассу, поэтому вам нужно лишь передать
опциональные аргументы. В нашем случае единственным аргументом класса
Person() будет name.
Строка self.email = email — это новый код, который отличает класс EmailPerson
от класса Person.
Теперь создадим одну персону:
>>> bob = EmailPerson('Bob Frapples', '[email protected]')
Мы должны иметь доступ к атрибутам name и email:
>>> bob.name
'Bob Frapples'
>>> bob.email
Почему бы нам просто не определить новый класс так, как показано далее?
>>> class EmailPerson(Person):
... def __init__(self, name, email):
... self.name = name
... self.email = email
Мы могли бы сделать это, но в таком случае потеряли бы возможность применять
наследование. Мы использовали метод super(), чтобы создать объект, который
работает примерно так же, как и объект класса Person. Есть и другое преимущество:
если определение класса Person в будущем изменится, с помощью метода super()
мы сможем гарантировать, что атрибуты и методы, которые класс EmailPerson на-
следует от класса Person, отреагируют на изменения.
Используйте метод super(), когда потомок делает что-то самостоятельно, но ему
все еще нужно что-то от предка (как и в реальной жизни).
В защиту self
Python критикуют за то, что, помимо применения пробелов, необходимо включать
self в качестве первого аргумента методов экземпляра класса (методов, которые
вы видели в предыдущем примере). Python использует аргумент self, чтобы найти
атрибуты и методы правильного объекта. Например, я покажу, как вы можете вы-
звать метод объекта и что Python сделает при этом за кулисами.
Получаем и устанавливаем значение атрибутов с помощью свойств
165
Помните класс Car из предыдущих примеров? Снова вызовем метод exclaim():
>>> car = Car()
>>> car.exclaim()
I'm a Car!
Вот что происходит за кулисами Python.
Выполняется поиск класса (Car) объекта car.
Объект car передается методу exclaim() класса Car как параметр self.
Ради забавы вы и сами можете запустить пример таким образом, и он сработает
точно так же, как и нормальный синтаксис (car.exclaim()):
>>> Car.exclaim(car)
I'm a Car!
Однако нет причин использовать такой более длинный стиль.
Получаем и устанавливаем значение
атрибутов с помощью свойств
Отдельные объектно-ориентированные языки поддерживают закрытые атрибуты
объектов, к которым нельзя получить доступ непосредственно; программистам