Python – популярный и функциональный язык программирования. С его помощью разработчики могут создавать разнообразные приложения. Python пользуется спросом не только у новичков. Опытные программисты часто задействуют его в качестве вспомогательного инструмента разработки сложных программных продуктов.
Питон поддерживает множество модулей, функций, а также фреймворков и библиотек. У него имеется ряд встроенных возможностей, позволяющих оперировать классами и объектами. Далее предстоит изучить конструкторы, а также метод __init__. Соответствующие компоненты выступают в качестве важных аспектов создания программ с использованием объектно-ориентированного программирования.
Термины и определения
Перед изучением конструкторов класса и __init__ в Питоне, разработчик должен запомнить несколько ключевых определений. Соответствующая терминология пригодится каждому, кто планирует заниматься программированием на объектно-ориентированных языках.
Запомнить рекомендуется следующие понятия:
- Алгоритмы – наборы инструкций, обрабатываемых программным обеспечением. Они направлены на решение поставленных перед разработчиком задач.
- API – правила, процедуры и протоколы, помогающие создавать различные программные приложения.
- Аргументы – значения, передаваемые в функции или имеющиеся в исходном коде команды.
- Символ – единица отображения данных в программе. Выражается она одной буквой или символьной записью.
- Тип данных – классификация данных схожих типов.
- Объекты – комбинации связанных переменных, констант и иные структур информации, способные выбираться и обрабатываться совместно.
- Класс – набор связанных объектов, наделенных общими свойствами.
- Константы – значения в приложении, которые всегда остаются неизменными. Они сохраняют свои первоначальные «параметры» на постоянной основе.
- Массивы – списки/группы схожих типов значений данных, подлежащие обязательной предварительной группировке. Все значения в массиве имеют один и тот же тип данных. Отличаются они по непосредственному положению в пределах заданного «множества».
- Цикл (или петля) – повторяющийся фрагмент кода. Цикл работает до тех пор, пока система не достигнет определенного условия (оно задается разработчиком заблаговременно). Также прекратить функционирование петли удается за счет специальной команды остановки.
- Бесконечный цикл – постоянно повторяющийся фрагмент кода. В основном соответствующее явление рассматривается в качестве ошибки. Оно может быть спровоцировано неправильным использованием функций, методов и иных инструментов программирования, а также нарушением общей логики.
- Итерация – один проход программы через заданный набор операций.
- Ключевое слово – слово, которое было зарезервировано синтаксисом языка. Оно используется для реализации действий, команд, функций и инструментов. Ключевые слова не могут применяться разработчиком при присваивании имен классам/переменным.
- Операнд – объект, которым разрешено манипулировать через поддерживаемые языком операторы.
- Оператор – объект, умеющий управлять операндами.
- Переменная – место хранения данных приложения. Именованная ячейка памяти, выделенная системой для работы с информацией в процессе функционирования программного обеспечения.
- Указатель – переменная, включающая в себя адрес места в памяти.
Все это – начальная «база», помогающая работать с объектно-ориентированным программированием. Дополнительно разработчикам рекомендуется запомнить, что означает термин «синтаксис». Таким словом характеризуют правила и принципы, необходимые для передачи операторов.
Конструктор класса
В объектно-ориентированном программировании разработчикам приходится сталкиваться с такими компонентами как «конструктор» и «деструктор». Начать их изучение рекомендуется с первого упомянутого элемента.
Конструктор – это метод, который будет автоматически вызываться системой при создании объектов. Он также называется конструктором объектов класса. Имя соответствующего метода будет регламентироваться синтаксисом определенного языка разработки. Пример – в Java имя конструктора класса полностью совпадает с именем самого создаваемого класса. В Python для соответствующих целей используются 2 специальные конструкции, о которых будет более подробно рассказано далее.
Основной задачей конструктора класса в Python является инициализация экземпляра класса. С его помощью удается определить, как именно создаются объекты в исходном коде проекта.
Метод init
__Init__ – это подсистема инициализации в Unix. Она отвечает за запуск всех остальных процессов. Если рассматривать соответствий компонент непосредственно в Python, можно назвать его инициализатором.
__init__ – конструктор класса. Подчеркивания между ключевым словом всегда указывают на то, что задействованный элемент относится к группе методов перегрузки операторов. Если соответствующие методы определяются в классе, их объекты смогут участвовать в сложении и вычитании, вызываться под видом функций и так далее.
Упомянутый метод будет вызываться тогда, когда объект создается из класса. С его помощью класс сможет инициализировать атрибуты.
Синтаксис
Изучая __init__ и другие конструкции, необходимо грамотно внедрять их в программный код. Для рассматриваемого инициализатора рекомендуется использовать следующую синтаксическую форму записи:
Здесь:
- Def – это ключевое слово. Оно используется для определения, потому что работать предстоит с функцией.
- Первый аргумент имеет прямое отношение к текущему объекту. Он будет связывать экземпляр с методом init().
- Аргументы метода init() не являются обязательными при разработке программного обеспечения. Конструктор может быть определен программистом с любым количеством «параметров».
Чтобы лучше понять принцип работы def __init__, рекомендуется изучить метод на наглядных примерах. Вот – один из них:
Соответствующий фрагмент кода создает класс с именем Car. Он будет отвечать за параметры, характерные автомобилям. Примеры – цвет, модель, скорость и так далее. Соответствующий класс включает в себя методы «старт», «ускорение», «переключение передачи». В приведенном примере метод __init__ использовался для инициализации атрибутов класса.
Наглядные примеры
Чтобы лучше понимать, как работает функция def __init__, далее предстоит ознакомиться с несколькими наглядными примерами создания классов в Python. Предложенные варианты – это самые разные сценарии. Они наглядно объяснят разницу между классами с конструкторами и без них.
Без конструктора
В Python допускается создание класса, исключая непосредственное определение конструктора. В этом случае требуется обратиться к конструктору суперкласса для инициализации классового экземпляра. Класс object является основой для всех остальных классов в рассматриваемом языке программирования.
А вот – еще один вариант кода, указывающий на то, что конструктор суперкласса вызывается для инициализации экземпляра подкласса:
Выше – результат обработки рассматриваемого кодового фрагмента.
Элементарный конструктор – без аргументов
Что значит def __init__, уже понятно. Теперь предстоит рассмотреть базовые основы работы с конструкторами классов в Python. Упомянутый язык программирования поддерживает создание инициализатора без аргументов:
Соответствующий прием может оказаться весьма полезным в отдельных ситуациях. Пример – ведение журнала с подсчетом классовых экземпляров.
С аргументами
При разработке программного обеспечения программисты в основном сталкиваются с функциями-конструкторами, поддерживающими те или иные аргументы. Они могут быть задействованы для инициализации переменных экземпляра:
Выше – не только фрагмент кода, демонстрирующего конструктор с аргументами, но и результат, выводимый в консоль при обработке приложения.
Наследование
Когда у разработчика имеется класс, наследуемый от суперкласса, метод __init__ будет вести себя точно таким же образом. Вот – пример попытки инициализации в программе дочернего класса:
Здесь после инициализации объекта Student будет выведен такой результат:
Перед дочерним классом вызывался родительский класс init. Соответствующий момент можно контролировать. Для этого достаточно корректировать порядок, в котором init вызывается для родительского/дочернего класса в Python.
Прочие особенности
Стоит обратить внимание на то, что в Питоне отсутствует поддержка сразу нескольких конструкторов, в отличие от основной массы известных объектно-ориентированных языков разработки. Примером может послужить Java.
Система Python допускает определение нескольких методов __init__, но последний из них обеспечит переопределение предыдущих определений.
Разработчик должен помнить, что __init__ ничего не возвращает. Если попытаться вернуть значение, отличное от None, система вызовет ошибку TypeError.
Метод new
Что значит __init__, понятно. В рассматриваемом языке разработки поддерживается еще один конструктор. Он называется __new. Предусматривает такие особенности:
- является истинным конструктором Python;
- вызывается до __init__;
- отвечает за создание и возврат нового объекта имеющегося программного кода;
- по умолчанию создает экземпляр класса и возвращает его, но переопределить соответствующий компонент для более сложного поведения не получится.
Вот – наглядный пример использования __new__:
__new__ может быть задействован для реализации паттернов проектирования – factory или singleton. В приведенном выше фрагменте метод __new__ будет проверять, есть ли экземпляр Singleton или нет. Далее осуществляется вызов super().__new__(cls). С помощью этой функции система создаст новый экземпляр. Если соответствующий элемент уже присутствует, __new__ вернет его. Подобный прием гарантирует наличие одного единственного экземпляра Singleton.
Совместное использование конструкторов
__new__ отвечает за непосредственное создание объекта, а __init__ – за его инициализацию. Разработчики иногда используют соответствующие методы совместно. Прием полезен, если имеющиеся объекты требуют сложной инициализации.
В соответствующем кодовом фрагменте метод __new__ выведет в консоль сообщение о создании объекта. __init__ используется для вывода текста об инициализации. Далее соответствующий конструктор установит атрибут value.
Особенности взаимодействия
Создание объекта класса в Python включает в себя два отдельных этапа:
- Непосредственное формирование объекта. На соответствующем шаге Python вызывает специальный метод __new__, отвечающий за создание новых элементов. Соответствующая «функция» является единственной умеющей возвращать новый объект класса.
- Инициализация. За нее отвечает __init__. Данный метод в Python ничего не возвращает. Он устанавливает значения атрибутов задействованного объекта.
Если рассматриваемые методы определены, __init__ и __new__ будут автоматически вызваны Python при создании нового классового объекта.
Переопределение __new__
Что значит def __init__ в Питоне, понятно. Как работает __new__ – тоже. В большинстве случаев второй метод не требует переопределения. Связано это с тем, что дефолтная реализация уже все организовала – она отвечает за создание и возврат нового экземпляра объекта.
Переопределение__new__ может потребоваться, если программист хочет изменить принцип создания объекта. Этот прием также актуален для некоторых паттернов проектирования:
Здесь:
- __new__ проверяет пул экземпляров.
- Если пул не является пустым, система использует существующий экземпляр их пула.
- В противном случае создается новый экземпляр.
Прием может быть особо полезным тогда, когда создание нового объекта – это затратная в плане распределения ресурсов и времени операция.
Интересует Python? Добро пожаловать на курс в Otus!