Зарегистрируйтесь, чтобы продолжить обучение

Классы, пространства имен, атрибуты Python: Введение в ООП

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

Пространство имен (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, это никакая не функция, преобразующая все в строку. Это самый что ни на есть настоящий класс, хоть и прикидывается функцией. К счастью, вне стандартной библиотеки такими "приемчиками" не злоупотребляют, и большинство классов таки можно узнать по имени.


Дополнительные материалы

  1. Классы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff