Skip to content

Class constructor – Конструктор класса

Что такое конструктор

Конструктор — это специальный метод __init__, который автоматически вызывается при создании нового экземпляра класса. Его основная задача — инициализировать начальное состояние объекта, создавая и задавая значения его атрибутам внутри тела метода.

Термины

Термины атрибут = свойство = поле = attribute = property = field – синонимы.
Например, коробка имеет свойства: длина, ширина, высота.

Как это работает

  1. При выражении obj = ClassName(args…) сначала вызывается метод __new__, который выделяет память под объект.
  2. Затем Python автоматически передаёт вновь созданный экземпляр в метод __init__ как параметр self.
  3. Внутри __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 и heightkeyword-only.

Особенности:

  • Звёздочка * чётко разграничивает, какие параметры можно задавать позиционно, а какие – по имени.
  • Удобно, если один-два ключевых аргумента нужны почти всегда, а остальные редко меняются.

Упражнения

Доработайте задачи используя конструктор с параметрами.

  1. Создайте оглавление книги. Для задания названий и страницы используйте класс . Для визуализации отступа пробелами, точками или подчеркиваниями используйте свойство класса.
  2. Создайте чек супермаркета в котором будет класс продукта со свойствами: название, количество, цена, валюта. Реализуйте вывод чека в рублях, а затем после изменения валюты в юанях.
  3. Используя библиотеку tkinter и Canvas. Нарисовать коробки на холсте с помощью задания координат и размеров через класс. Добавьте отображение размеров коробки внутри фигуры вдоль осей. Выведите размерность в мм, затем измените на см и заново отрисуйте коробки с указанными параметрами.
  4. Создайте часы, с разными часовыми поясами, например: Лондон UTC+0, Москва UTC+3, Астана UTC+6, Пекин UTC+8. Цвет фона часов сделать светлый отрисовать, а затем поменять на темный. По примеру реализации темной/светлой темы.