Привет Хаброжители! У нас недавно вышла новая книга про «Python». Предлагаем сразу ознакомится с ознакомительным материалом.Отрывок. 7.4. Использование IDLE
Так как IDLE включает REPL, вы можете ввести приведенный код и проанализировать его прямо в REPL. Однако вы также можете написать код, запустить его и проанализировать из REPL. Чтобы опробовать эту возможность, откройте новый файл и включите в него следующий код:
name = "Matt"
first = name
age = 1000
print(id(age))
age = age + 1
print(id(age))
names = []
print(id(names))
names.append("Fred")
print(id(names))Сохраните код в файле с именем iden.py. Запустите файл. В IDLE для этого следует нажать клавишу F5. В REPL будут выведены четыре числа. Первые два будут разными; это говорит о том, что целое число является неизменяемым. Последние два числа совпадают. Это объясняется тем, что несмотря на изменение списка names идентификатор остался прежним. В общем-то в этом факте нет ничего принципиально нового.
Теперь самое интересное: если ввести в REPL команду dir(), она выведет список переменных. Вы увидите, что глобальные переменные из iden.py теперь стали доступны.
REPL в IDLE открывает доступ ко всем глобальным переменным. Вы можете просмотреть name и names и даже вызывать функции или методы — например, names.append(«George»).
Имея возможность изучить результаты только что выполненного кода, вы можете быстро проанализировать код и поэкспериментировать с ним. Опытные разработчики Python нередко пишут код в REPL, вставляют его в файл, снова запускают файл, пишут новый код в REPL и продолжают писать код таким способом.



Отрывок. 22. Субклассирование
Помимо группировки состояния и операций, классы также обеспечивают повторное использование кода. Если у вас уже имеется класс, а вам нужен другой класс, слегка отличающийся от него поведением, один из способов повторного использования заключается в субклассировании. Класс, от которого производится субклассирование, называется суперклассом (другое распространенное название суперкласса — родительский класс).
Предположим, вы хотите создать кресло, способное вмещать шесть лыжников. Чтобы создать класс Chair6, моделирующий кресло для шести человек, — более специализированную версию Chair, можно воспользоваться субклассированием. Субклассы позволяют программисту наследовать методы родительских классов и переопределять методы, которые нужно изменить.
Ниже приведен класс Chair6, который является субклассом CorrectChair:
>>> class Chair6(CorrectChair):
... max_occupants = 6Обратите внимание: родительский класс CorrectChair заключается в круглые скобки после имени класса. Заметим, что Chair6 не определяет конструктор в своем теле, однако вы можете создавать экземпляры класса:
>>> sixer = Chair6(76)Как Python создает объект, если в классе не определен конструктор? Вот что происходит: когда Python ищет метод .__init__, поиск начинается с Chair6. Так как класс Chair6 содержит только атрибут max_occupants, Python не найдет здесь метод .__init__. Но поскольку Chair6 является субклассом CorrectChair, он обладает атрибутом __bases__ с перечислением базовых классов, сведенных в кортеж:


>>> Chair6.__bases__
(__main__.CorrectChair,)Затем Python ищет конструктор в базовых классах. Он находит конструктор в CorrectChair и использует его для создания нового класса.
Такой же поиск происходит при вызове .load для экземпляра. У экземпляра нет атрибута, соответствующего имени метода, поэтому Python проверяет класс экземпляра. В Chair6 тоже нет метода .load, поэтому Python ищет атрибут в базовом классе CorrectChair. Здесь метод .load вызывается со слишком большим значением, что приводит к ошибке ValueError:
>>> sixer.load(7)
Traceback (most recent call last):
File "/tmp/chair.py", line 30, in <module>
sixer.load(7)
File "/tmp/chair.py", line 13, in load
new_val = self._check(self.count + number)
File "/tmp/chair.py", line 23, in _check
number))
ValueError: Invalid count:7Python находит метод в базовом классе, но вызов метода ._check приводит к ошибке ValueError.
22.1. Подсчет остановок
Иногда лыжнику не удается нормально сесть на подъемник. В таких случаях оператор замедляет движение или останавливает подъемник, чтобы помочь лыжнику. Мы можем восп��льзоваться Python для создания нового класса, который будет подсчитывать количество таких остановок.
Предположим, при каждом вызове .load должна вызываться функция, которая возвращает логический признак того, произошла остановка или нет. В параметрах функции передается количество лыжников и объект кресла.
Ниже приведен класс, который получает функцию is_stalled в конструкторе. Эта функция будет вызываться при каждом вызове .load:
>>> class StallChair(CorrectChair):
... def __init__(self, id, is_stalled):
... super().__init__(id)
... self.is_stalled = is_stalled
... self.stalls = 0
...
... def load(self, number):
... if self.is_stalled(number, self):
... self.stalls += 1
... super().load(number)Чтобы создать экземпляр этого класса, необходимо предоставить функцию is_stalled. Следующая простая функция генерирует остановки в 10 % случаев:
>>> import random
>>> def ten_percent(number, chair):
... """Return True 10% of time"""
... return random.random() < .1Теперь можно создать экземпляр, указав функцию ten_percent в качестве параметра is_stalled:
>>> stall42 = StallChair(42, ten_percent)22.2. super
Напомним, что StallChair определяет свой собственный метод .__init__, который вызывается при создании экземпляра. Обратите внимание: первая строка конструктора выглядит так:
super().__init__(id)При вызове super внутри метода вы получаете доступ к правильному родительскому классу.
Строка в конструкторе позволяет вызвать конструктор CorrectChair. Вместо того чтобы повторять логику назначения атрибутов id и count, вы можете использовать логику из родительского класса. Так как StallChair имеет дополнительные атрибуты, которые нужно задать для экземпляра, это можно сделать после вызова родительского конструктора.

Метод .load тоже содержит вызов super:
def load(self, number):
if self.is_stalled(number, self):
self.stalls += 1
super().load(number)В методе .load вы вызываете функцию is_stalled, чтобы определить, останавливался ли подъемник, после чего передаете управление исходной функциональности .load из CorrectChair при помощи super.
Размещение общего кода в одном месте (в базовом классе) сокращает количество ошибок и дублирований кода.
Об авторе
Мэтт Харрисон использует Python с 2000 года. Он руководит компанией MetaSnake, занимающейся консультационными услугами и проведением корпоративного обучения в области Python и теории анализа данных. В прошлом он работал в областях научных исследований, управления сборкой и тестированием, бизнес-аналитики и хранения данных.
Он выступал с презентациями и учебными лекциями на таких конференциях, как Strata, SciPy, SCALE, PyCON и OSCON, а также на локальных пользовательских конференциях. Структура и материал этой книги основаны на его практическом опыте преподавания Python. Мэтт периодически публикует в «Твиттере» полезную информацию, относящуюся к Python (@__mharrison__).
Научные редакторы
Роджер Э. Дэвидсон (Roger A. Davidson) в настоящее время является деканом факультета математики в колледже Америкэн Ривер (Сакраменто, штат Калифорния). Его докторская диссертация была написана на тему авиационно-космической техники, но он также является обладателем дипломов об образовании в области computer science, электротехники и системотехники, а также недавно получил сертификат в области data science (с чего и началось его увлечение Python). На протяжении своей карьеры Роджер работал в NASA, в компаниях из списка Fortune 50, в стартапах и муниципальных колледжах. Он с энтузиазмом относится к образованию, науке (не только к обработке данных), пирогам с ежевикой и руководству неоднородными коллективами при решении больших задач.
Эндрю Маклафлин (AndrewMcLaughlin) — программист и проектировщик, системный администратор в первую половину дня и семьянин во вторую. Из-за своего внимания к деталям занимается веб-программированием с 1998 года. Обладатель диплома с отличием университета Джорджа Фокса, Эндрю получил степень в области систем управления и информации. В свободное время он ходит в турпоходы со своей женой и двумя детьми, а также иногда работает в столярной мастерской (все пальцы пока на месте). Читайте его публикации в «Твиттере»: @amclaughlin.
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 20% по купону — Python.
