Appearance
Class constructor – Конструктор класса
Что такое конструктор
Конструктор — это специальный метод __init__
, который автоматически вызывается при создании нового экземпляра класса. Его основная задача — инициализировать начальное состояние объекта, создавая и задавая значения его атрибутам внутри тела метода.
Термины
Термины атрибут
= свойство
= поле
= attribute
= property
= field
– синонимы.
Например, коробка имеет свойства: длина
, ширина
, высота
.
Как это работает
- При выражении
obj = ClassName(args…)
сначала вызывается метод__new__
, который выделяет память под объект. - Затем Python автоматически передаёт вновь созданный экземпляр в метод
__init__
как параметрself
. - Внутри
__init__(self, …)
вы прописываете логику инициализации: создаёте атрибутыself.attr = value
, проверяете переданные аргументы или рассчитываете значения по умолчанию.
Связь с атрибутами экземпляра и класса
- Всё, что вы присваиваете через
self.имя = значение
внутри__init__
, становится атрибутом конкретного экземпляра. - Атрибуты, объявленные сразу в теле класса (вне методов), являются атрибутами класса и разделяются всеми экземплярами.
Конструктор без параметров
python
class Box:
def __init__(self):
self.width_object = 1
self.length_object = 3
self.height_object = 5
box = Box()
print(box, box.width_object, box.length_object, box.height_object)
print(box, box.__dict__)
Описание работы:
- При
Box()
Python создаёт новый объект и вызывает метод__init__
. - Внутри
__init__
черезself
создаются поля экземпляра:width_object
length_object
height_object
- Выражение
box.__dict__
возвращает словарь всех атрибутов экземпляра и их значений.
Особенности:
- Каждый вызов
Box()
инициализирует свои атрибуты, изолированные от других экземпляров.
Конструктор с параметрами
python
class Box:
def __init__(self, width: int, length: int, height: int):
self.width_object = width
self.length_object = length
self.height_object = height
box = Box(1, 2, 3)
print(box, box.__dict__)
Описание работы:
- При создании
Box(1, 2, 3)
аргументы1, 2, 3
поступают в параметрыwidth
,length
,height
. - Эти значения сразу сохраняются в поля экземпляра.
- Если вы попытаетесь вызвать
Box()
без аргументов или с их недостатком, Python выдастTypeError
.
Особенности:
- Все параметры обязательны.
- Позволяет задавать разные размеры коробок прямо при создании.
Конструктор с параметрами по умолчанию
python
class Box:
def __init__(self, width: int = 2, length: int = 4, height: int = 6):
self.width_object = width
self.length_object = length
self.height_object = height
box_1 = Box()
print(box_1.__dict__) # {width:2, length:4, height:6}
box_2 = Box(11)
print(box_2.__dict__) # {width:11, length:4, height:6}
box_3 = Box(11, 22)
print(box_3.__dict__) # {width:11, length:22, height:6}
Описание работы:
- Если аргумент не передан, используется значение по умолчанию.
Особенности:
- Параметры со значениями по умолчанию должны идти после обязательных.
- Упрощает создание, когда большинство значений стандартны.
Конструктор с позиционными параметрами
python
class Box:
def __init__(self, width: int = 2, length: int = 4, height: int = 6):
self.width_object = width
self.length_object = length
self.height_object = height
box_1 = Box()
print(box_1.__dict__)
box_2 = Box(11)
print(box_2.__dict__)
box_3 = Box(11, 22, 33)
print(box_3.__dict__)
Описание работы:
- Все параметры позиционные (можно передавать только по порядку).
Box(11, 22, 33)
задаёт каждый аргумент явно.- Любое пропущенное значение заменяется соответствующим дефолтным.
Особенности:
- Читабельность падает, если много позиционных аргументов.
- Может привести к ошибкам при смене порядка параметров в будущем.
Конструктор с именными параметрами
python
class Box:
def __init__(self, width: int, length: int = 4, height: int = 6):
self.width_object = width
self.length_object = length
self.height_object = height
box_1 = Box(11)
print(box_1.__dict__) # width=11, length=55, height=6
box_2 = Box(22, length=55)
print(box_2.__dict__) # width=22, length=55, height=6
box_3 = Box(height=66, width=77)
print(box_3.__dict__) # width=77, length=4, height=66
Описание работы:
width
остаётся позиционным, остальные — могут быть заданы как именованные.
Особенности:
- Яснее, какой параметр за что отвечает.
- Сочетание позиционных и именованных аргументов – гибкая схема.
Конструктор со строго именными параметрами
python
class Box:
def __init__(self, *, width: int, length: int = 4, height: int = 6):
self.width_object = width
self.length_object = length
self.height_object = height
box_1 = Box(width=88)
print(box_1.__dict__)
box_2 = Box(width=99, height=11)
print(box_2.__dict__)
box_3 = Box(height=33, width=22)
print(box_3.__dict__)
Описание работы:
- Звёздочка
*
в списке параметров переводит их в keyword-only, т.е. все аргументы принимаются только по имени. Любая попытка передать параметры позиционно вызовет ошибку.
Особенности:
- Обеспечивает максимальную читаемость вызова конструктора.
- Уменьшает риск перепутать порядок аргументов.
Конструктор со смешанными параметрами
python
class Box:
def __init__(self, width: int = 2, *, length: int = 4, height: int = 6):
self.width_object = width
self.length_object = length
self.height_object = height
box_1 = Box(11)
print(box_1.__dict__) # width=11, length=4, height=6
box_2 = Box(height=77)
print(box_2.__dict__) # width=2, length=4, height=77
box_3 = Box(height=33, width=22)
print(box_3.__dict__) # width=22, length=4, height=33
Описание работы:
width
остаётся позиционно-по-умолчанию.- Параметры
length
иheight
– keyword-only.
Особенности:
- Звёздочка
*
чётко разграничивает, какие параметры можно задавать позиционно, а какие – по имени. - Удобно, если один-два ключевых аргумента нужны почти всегда, а остальные редко меняются.
Упражнения
Доработайте задачи используя конструктор с параметрами.
- Создайте оглавление книги. Для задания названий и страницы используйте класс . Для визуализации отступа пробелами, точками или подчеркиваниями используйте свойство класса.
- Создайте чек супермаркета в котором будет класс продукта со свойствами: название, количество, цена, валюта. Реализуйте вывод чека в рублях, а затем после изменения валюты в юанях.
- Используя библиотеку tkinter и Canvas. Нарисовать коробки на холсте с помощью задания координат и размеров через класс. Добавьте отображение размеров коробки внутри фигуры вдоль осей. Выведите размерность в
мм
, затем измените насм
и заново отрисуйте коробки с указанными параметрами. - Создайте часы, с разными часовыми поясами, например: Лондон UTC+0, Москва UTC+3, Астана UTC+6, Пекин UTC+8. Цвет фона часов сделать светлый отрисовать, а затем поменять на темный. По примеру реализации темной/светлой темы.