Классы

Классы, пространства имён, атрибуты.

На прошлом уроке уже прозвучало слово "класс". Я сравнил класс с шаблоном, по которому создаются объекты этого класса, называемые экземплярами (класса). Далее мы разберём объявление классов с точки зрения синтаксиса, но сначала стоит отметить, что каждый класс является отдельным пространством имён.

Пространство имён (namespace), это некая совокупность этих имён, в пределах которой каждое имя уникально. При этом разные пространства имён могут содержать одно и то же имя, но в разных пространствах имён это имя может быть связано с разными сущностями.

Уже знакомым вам примером пространств имён является модуль. В пределах модуля вы не сможете сделать два объявления с одинаковыми именами: то, что будет сделано позже, просто поменяет значение имени. Зато разные модули могут содержать элементы с одним и тем же именем.

Каждый класс также является отдельным пространством имён — имён атрибутов класса. Атрибут, это то же самое определение. В момент определения класса определяются и его атрибуты.

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

Объявление класса.

Класс может быть объявлен в любом месте кода. Ведь объявление класса, это всего лишь создание специального объекта. Да, классы — тоже объекты! Однако чаще всего классы объявляются на верхнем уровне модулей и таким образом оказываются созданы при первом импорте модуля (я расскажу об этом позже).

Объявление минимального класса выглядит так:

class C:
    pass

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

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

Класс C сейчас не содержит ни одного атрибута. Но это уже полноценный класс. По этому "шаблону" можно создавать экземпляры, о чём мы поговорим в следующем уроке. Но давайте же поместим в класс хоть что-то, а заодно посмотрим, как выглядит созданный класс снаружи:

>>> class C:
...     a = 100
...     b = "Potato"
...
>>> C
<class '__main__.C'>
>>> C.a
100
>>> C.b
"Potato"

Эта версия класса C уже содержит два атрибута — a и b. Эти атрибуты похожи на переменные в модулях, но их видимость ограничена классом C.

Обратите внимание на то, как отображается класс C при выводе в REPL: <class '__main__.C'>. Пространство имён, которое вы видите, когда запускаете REPL, так и называется — "main", поэтому полное имя класса, который был объявлен в этом пространстве имён, содержит именно это имя модуля. Классы, созданные в именованных модулях, будут содержать полные имена модулей в тексте их (классов) полного имени.

Именование классов.

В Python классы принято называть в стиле CamelCase. Это позволяет визуально отделить классы от переменных, функций, констант. Но будьте готовы к тому, что иногда имя у класса может выглядеть, как имя функции. Далеко за примером ходить не нужно:

>>> dict
<class 'dict'>
>>> list
<class 'list'>
>>> tuple
<class 'tuple'>
>>> str
<class 'str'>
>>> int
<class 'int'>

Оказывается, что str, это никакая не функция, преобразующая всё в строку! Это самый что ни на есть настоящий класс, хоть и прикидывается функцией! К счастью, вне стандартной библиотеки такими "приёмчиками" не злоупотребляют, и большинство классов таки можно узнать по имени :)

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Javascript, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →