Простой Python — страница 21 из 66

Иногда в стандартной библиотеке нет нужной вам функциональности или же она реализована не так, как вам нужно. В этом случае можете воспользоваться целым миром стороннего программного обеспечения с открытым исходным кодом. Отлично зарекомендовали себя следующие ресурсы:

• PyPi (известный также как Cheese Shop («Сырный магазин»), он назван в честь старого Monty Python skit) (http://bit.ly/py-libex);

• github (https://github.com/Python);

• readthedocs (https://readthedocs.org/).

Небольшие фрагменты кода вы можете найти по адресу http://code.activestate.com/recipes/langs/python/.

Почти весь код Python использует функции стандартных библиотек Python. Кое-где показаны внешние пакеты: я упоминал requests в главе 1, а в подразделе «За пределами стандартной библиотеки: Requests» раздела «Веб-клиенты» главы 9 приведу более подробную информацию. В приложении Г показано, как устанавливать стороннее программное обеспечение Python, а также рассмотрены основные детали разработки.

Упражнения

1. Создайте файл, который называется zoo.py. В нем объявите функцию hours(), которая выводит на экран строку ' Open 9–5 daily'. Далее используйте интерактивный интерпретатор, чтобы импортировать модуль zoo и вызвать его функцию hours().

2. В интерактивном интерпретаторе импортируйте модуль zoo под именем menagerie и вызовите его функцию hours().

3. Оставаясь в интерпретаторе, импортируйте непосредственно функцию hours() из модуля zoo и вызовите ее.

4. Импортируйте функцию hours() под именем info и вызовите ее.

5. Создайте словарь с именем plain, содержащий пары «ключ — значение» 'a': 1, 'b': 2 и 'c':3, а затем выведите его на экран.

6. Создайте OrderedDict с именем fancy из пар «ключ — значение», приведенных в упражнении 5, и выведите его на экран. Изменился ли порядок ключей?

7. Создайте defaultdict с именем dict_of_lists и передайте ему аргумент list. Создайте список dict_of_lists['a'] и присоедините к нему значение 'something for a' за одну операцию. Выведите на экран dict_of_lists['a'].

Глава 6. Ой-ой-ой: объекты и классы

Таинственных объектов не бывает. Они такими просто кажутся.

Элизабет Боуэн

Возьмите объект. Сделайте что-нибудь с ним. Добавьте что-нибудь другое к нему.

Джаспер Джонс

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

Что такое объекты

Как я упоминал в главе 2, все в Python, от чисел до модулей, является объектами. Однако Python скрывает бо́льшую часть принципов функционирования объектов с помощью особого синтаксиса. Вы можете написать num = 7, чтобы создать объект типа int со значением 7, и присвоить ссылку на него по имени num. Заглядывать внутрь объектов нужно только в случае, если вам необходимо создать собственный объект или модифицировать поведение уже существующих объектов. В этой главе вы увидите, как сделать и то и другое.

Объект содержит как данные (переменные, которые называются атрибутами), так и код (функции, которые называются методами). Он представляет собой уникальный экземпляр какого-то конкретного предмета. Например, целочисленный объект со значением 7 может использовать методы вроде сложения и умножения, что показано в разделе «Числа» главы 2. 8 — это другой объект. Это значит, что существует класс Integer, которому принадлежат объекты 7 и 8. Строки 'cat' и 'duck' также являются объектами и имеют методы, с которыми вы уже знакомы, — например, capitalize() и replace().

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

Объекты можно считать существительными, а их методы — глаголами. Объект представляет отдельную вещь, а его методы определяют, как она взаимодействует с другими вещами.

В отличие от модулей, вы можете иметь одновременно несколько объектов, каждый из которых имеет разные значения атрибутов. Они являются суперструктурами данных, в которые был добавлен код.

Определяем класс с помощью ключевого слова class

В главе 1 я сравнил объект с пластмассовой коробкой. Класс похож на форму, из которой создается эта коробка. Например, String является встроенным классом Python, который создает строковые объекты вроде 'cat' и 'duck'. Python имеет множество других встроенных классов, позволяющих создавать другие стандартные типы данных, включая списки, словари и т. д. Чтобы создать собственный объект в Python, вам сначала нужно определить класс с помощью ключевого слова class. Рассмотрим простой пример.

Предположим, вы хотите определять объекты, которые представляют информацию о людях. Каждый объект будет представлять одного человека. Сначала вам нужно определить класс Person в качестве формы. В последующих примерах мы попробуем использовать больше версий этого класса по мере продвижения от простейшего класса к классу, который действительно может делать что-то полезное.

В первый раз создадим самый простой из возможных классов — пустой класс:

>>> class Person():

…·····pass

Как и в случае с функциями, нам нужно сказать pass, чтобы показать, что этот класс пуст. Такое определение является необходимым минимумом создания объекта. Вы создаете объект из класса с помощью вызова имени класса так, будто оно является функцией:

>>> someone = Person()

В этом случае Person() создает отдельный объект класса Person и присваивает его имени someone. Но наш класс Person пуст, поэтому объект someone, который мы создали, просто занимает место и ничего не делает. Вы никогда не будете определять такой класс, я показываю его только для того, чтобы на его основе создать следующий пример.

Попробуем снова — в этот раз добавим в класс специальный метод инициализации __init__:

>>> class Person():

…·····def __init__(self):

…·········pass

Так выглядят реальные определения классов в Python. Согласен, __init__() и self смотрятся странно. __init__() — это особое имя метода, который инициализирует отдельный объект с помощью определения его класса[5]. Аргумент self указывает на сам объект.

Когда вы указываете __init__() в определении класса, его первым параметром должен быть объект self. Несмотря на то что в Python self не является зарезервированным словом, оно применяется довольно часто. Никому из тех, кто будет читать ваш код позже (включая вас!), не придется гадать, что вы имели в виду, когда использовали слово self.

Но даже в этом случае второе определение класса Person создает объект, который ничего не делает. Наша третья попытка покажет, насколько легко создать простой объект в Python. В этот раз мы добавим параметр name в метод инициализации:

>>> class Person():

…·····def __init__(self, name):

…·········self.name = name

>>>

Теперь мы можем создать объект класса Person, передав строку для параметра name:

>>> hunter = Person('Elmer Fudd')

Эта строка кода делает следующее:

• выполняет поиск определения класса Person;