Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 122

 Метод __init__() вызывает метод Person.__init__(). Последний заботится о том,

чтобы передать аргумент self суперклассу, поэтому вам нужно лишь передать

опциональные аргументы. В нашем случае единственным аргументом класса

Person() будет name.

 Строка self.email = email — это новый код, который отличает класс EmailPerson

от класса Person.

Теперь создадим одну персону:

>>> bob = EmailPerson('Bob Frapples', '[email protected]')

Мы должны иметь доступ к атрибутам name и email:

>>> bob.name

'Bob Frapples'

>>> bob.email

'[email protected]'

Почему бы нам просто не определить новый класс так, как показано далее?

>>> 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!

Однако нет причин использовать такой более длинный стиль.

Получаем и устанавливаем значение

атрибутов с помощью свойств

Отдельные объектно-ориентированные языки поддерживают закрытые атрибуты

объектов, к которым нельзя получить доступ непосредственно; программистам