Python – популярный и функциональный язык программирования. С его помощью разработчики могут создавать разнообразные приложения. Python пользуется спросом не только у новичков. Опытные программисты часто задействуют его в качестве вспомогательного инструмента разработки сложных программных продуктов. 

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

Термины и определения

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

Запомнить рекомендуется следующие понятия:

  1. Алгоритмы – наборы инструкций, обрабатываемых программным обеспечением. Они направлены на решение поставленных перед разработчиком задач.
  2. API – правила, процедуры и протоколы, помогающие создавать различные программные приложения.
  3. Аргументы – значения, передаваемые в функции или имеющиеся в исходном коде команды.
  4. Символ – единица отображения данных в программе. Выражается она одной буквой или символьной записью.
  5. Тип данных – классификация данных схожих типов.
  6. Объекты – комбинации связанных переменных, констант и иные структур информации, способные выбираться и обрабатываться совместно.
  7. Класс – набор связанных объектов, наделенных общими свойствами.
  8. Константы – значения в приложении, которые всегда остаются неизменными. Они сохраняют свои первоначальные «параметры» на постоянной основе.
  9. Массивы – списки/группы схожих типов значений данных, подлежащие обязательной предварительной группировке. Все значения в массиве имеют один и тот же тип данных. Отличаются они по непосредственному положению в пределах заданного «множества».
  10. Цикл (или петля) – повторяющийся фрагмент кода. Цикл работает до тех пор, пока система не достигнет определенного условия (оно задается разработчиком заблаговременно). Также прекратить функционирование петли удается за счет специальной команды остановки.
  11. Бесконечный цикл – постоянно повторяющийся фрагмент кода. В основном соответствующее явление рассматривается в качестве ошибки. Оно может быть спровоцировано неправильным использованием функций, методов и иных инструментов программирования, а также нарушением общей логики.
  12. Итерация – один проход программы через заданный набор операций.
  13. Ключевое слово – слово, которое было зарезервировано синтаксисом языка. Оно используется для реализации действий, команд, функций и инструментов. Ключевые слова не могут применяться разработчиком при присваивании имен классам/переменным.
  14. Операнд – объект, которым разрешено манипулировать через поддерживаемые языком операторы.
  15. Оператор – объект, умеющий управлять операндами.
  16. Переменная – место хранения данных приложения. Именованная ячейка памяти, выделенная системой для работы с информацией в процессе функционирования программного обеспечения.
  17. Указатель – переменная, включающая в себя адрес места в памяти.

Все это – начальная «база», помогающая работать с объектно-ориентированным программированием. Дополнительно разработчикам рекомендуется запомнить, что означает термин «синтаксис». Таким словом характеризуют правила и принципы, необходимые для передачи операторов.

Конструктор класса

В объектно-ориентированном программировании разработчикам приходится сталкиваться с такими компонентами как «конструктор» и «деструктор». Начать их изучение рекомендуется с первого упомянутого элемента.

Конструктор – это метод, который будет автоматически вызываться системой при создании объектов. Он также называется конструктором объектов класса. Имя соответствующего метода будет регламентироваться синтаксисом определенного языка разработки. Пример – в Java имя конструктора класса полностью совпадает с именем самого создаваемого класса. В Python для соответствующих целей используются 2 специальные конструкции, о которых будет более подробно рассказано далее.

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

Метод init

__Init__ – это подсистема инициализации в Unix. Она отвечает за запуск всех остальных процессов. Если рассматривать соответствий компонент непосредственно в Python, можно назвать его инициализатором.

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

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

Синтаксис

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

Конструкторы в Python: как работать с Init

Здесь:

  1. Def – это ключевое слово. Оно используется для определения, потому что работать предстоит с функцией.
  2. Первый аргумент имеет прямое отношение к текущему объекту. Он будет связывать экземпляр с методом init().
  3. Аргументы метода init() не являются обязательными при разработке программного обеспечения. Конструктор может быть определен программистом с любым количеством «параметров».

Чтобы лучше понять принцип работы def __init__, рекомендуется изучить метод на наглядных примерах. Вот – один из них:

Конструкторы в Python: как работать с Init

Соответствующий фрагмент кода создает класс с именем Car. Он будет отвечать за параметры, характерные автомобилям. Примеры – цвет, модель, скорость и так далее. Соответствующий класс включает в себя методы «старт», «ускорение», «переключение передачи». В приведенном примере метод __init__ использовался для инициализации атрибутов класса.

Наглядные примеры

Чтобы лучше понимать, как работает функция def __init__, далее предстоит ознакомиться с несколькими наглядными примерами создания классов в Python. Предложенные варианты – это самые разные сценарии. Они наглядно объяснят разницу между классами с конструкторами и без них.

Без конструктора

В Python допускается создание класса, исключая непосредственное определение конструктора. В этом случае требуется обратиться к конструктору суперкласса для инициализации классового экземпляра. Класс object является основой для всех остальных классов в рассматриваемом языке программирования.

Конструкторы в Python: как работать с Init

А вот – еще один вариант кода, указывающий на то, что конструктор суперкласса вызывается для инициализации экземпляра подкласса:

Конструкторы в Python: как работать с Init
Конструкторы в Python: как работать с Init

Выше – результат обработки рассматриваемого кодового фрагмента.

Элементарный конструктор – без аргументов

Что значит def __init__, уже понятно. Теперь предстоит рассмотреть базовые основы работы с конструкторами классов в Python. Упомянутый язык программирования поддерживает создание инициализатора без аргументов:

Конструкторы в Python: как работать с Init
Конструкторы в Python: как работать с Init

Соответствующий прием может оказаться весьма полезным в отдельных ситуациях. Пример – ведение журнала с подсчетом классовых экземпляров.

С аргументами

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

Конструкторы в Python: как работать с Init
Конструкторы в Python: как работать с Init

Выше – не только фрагмент кода, демонстрирующего конструктор с аргументами, но и результат, выводимый в консоль при обработке приложения.

Наследование

Когда у разработчика имеется класс, наследуемый от суперкласса, метод __init__ будет вести себя точно таким же образом. Вот – пример попытки инициализации в программе дочернего класса:

Конструкторы в Python: как работать с Init

Здесь после инициализации объекта Student будет выведен такой результат:

Конструкторы в Python: как работать с Init

Перед дочерним классом вызывался родительский класс init. Соответствующий момент можно контролировать. Для этого достаточно корректировать порядок, в котором init вызывается для родительского/дочернего класса в Python.

Прочие особенности

Стоит обратить внимание на то, что в Питоне отсутствует поддержка сразу нескольких конструкторов, в отличие от основной массы известных объектно-ориентированных языков разработки. Примером может послужить Java. 

Система Python допускает определение нескольких методов __init__, но последний из них обеспечит переопределение предыдущих определений.

Конструкторы в Python: как работать с Init

Разработчик должен помнить, что __init__ ничего не возвращает. Если попытаться вернуть значение, отличное от None, система вызовет ошибку TypeError.

Метод new

Что значит __init__, понятно. В рассматриваемом языке разработки поддерживается еще один конструктор. Он называется __new. Предусматривает такие особенности:

  • является истинным конструктором Python;
  • вызывается до __init__;
  • отвечает за создание и возврат нового объекта имеющегося программного кода;
  • по умолчанию создает экземпляр класса и возвращает его, но переопределить соответствующий компонент для более сложного поведения не получится.

Вот – наглядный пример использования __new__:

Конструкторы в Python: как работать с Init

__new__ может быть задействован для реализации паттернов проектирования – factory или singleton. В приведенном выше фрагменте метод __new__ будет проверять, есть ли экземпляр Singleton или нет. Далее осуществляется вызов super().__new__(cls). С помощью этой функции система создаст новый экземпляр. Если соответствующий элемент уже присутствует, __new__ вернет его. Подобный прием гарантирует наличие одного единственного экземпляра Singleton.

Совместное использование конструкторов

__new__ отвечает за непосредственное создание объекта, а __init__ – за его инициализацию. Разработчики иногда используют соответствующие методы совместно. Прием полезен, если имеющиеся объекты требуют сложной инициализации.

Конструкторы в Python: как работать с Init

В соответствующем кодовом фрагменте метод __new__ выведет в консоль сообщение о создании объекта. __init__ используется для вывода текста об инициализации. Далее соответствующий конструктор установит атрибут value.

Особенности взаимодействия

Создание объекта класса в Python включает в себя два отдельных этапа:

  1. Непосредственное формирование объекта. На соответствующем шаге Python вызывает специальный метод __new__, отвечающий за создание новых элементов. Соответствующая «функция» является единственной умеющей возвращать новый объект класса.
  2. Инициализация. За нее отвечает __init__. Данный метод в Python ничего не возвращает. Он устанавливает значения атрибутов задействованного объекта.
Конструкторы в Python: как работать с Init

Если рассматриваемые методы определены, __init__ и __new__ будут автоматически вызваны Python при создании нового классового объекта.

Переопределение __new__

Что значит def __init__ в Питоне, понятно. Как работает __new__ – тоже. В большинстве случаев второй метод не требует переопределения. Связано это с тем, что дефолтная реализация уже все организовала – она отвечает за создание и возврат нового экземпляра объекта.

Переопределение__new__ может потребоваться, если программист хочет изменить принцип создания объекта. Этот прием также актуален для некоторых паттернов проектирования:

Конструкторы в Python: как работать с Init

Здесь:

  1. __new__ проверяет пул экземпляров.
  2. Если пул не является пустым, система использует существующий экземпляр их пула.
  3. В противном случае создается новый экземпляр.

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

Интересует Python? Добро пожаловать на курс в Otus!