Глава 14 · Создаём объекты реального мира

__init__ и создание объекта

__init__ не создаёт объект — он настраивает объект, который уже существует.

Что на самом деле происходит при Sobaka("Рекс", 3)

Sobaka("Рекс",3)вызов классаPython создаётновый пустой…объект уже существуетвызывается__init__(self,…self — это тот самыйновый объект__init__настраивает…self.klichka = ...готовый объектвозвращаетсяrex = ...
__init__ НЕ создаёт объект — он настраивает объект, который Python уже создал
Частое заблуждение: «__init__ создаёт объект»
Это не так. К моменту вызова __init__ объект уже существует — иначе Python не смог бы передать его первым аргументом (self)! Роль __init__ — не создать объект, а настроить его начальное состояние: имя честнее было бы «инициализатор», а не «конструктор» — так его и называют в документации Python.

Значения по умолчанию в __init__

__init__ — обычная функция (глава 13 применима целиком): параметры могут иметь значения по умолчанию:

init_s_umolchaniem.py
class Sobaka:
    def __init__(self, klichka, vozrast=1):
        self.klichka = klichka
        self.vozrast = vozrast

shchenok = Sobaka("Бим")             # vozrast = 1 по умолчанию
rex = Sobaka("Рекс", vozrast=3)      # явно указан

__init__ может вызывать другие методы

init_vyzyvaet_metod.py
class Sobaka:
    def __init__(self, klichka, vozrast=1):
        self.klichka = klichka
        self.vozrast = vozrast
        self.privet()          # метод можно вызвать уже внутри __init__

    def privet(self):
        print(f"Новый пёс на сцене: {self.klichka}!")

rex = Sobaka("Рекс")   # печатает приветствие сразу при создании
Debug Lab 2: self.x = x записали просто как x = x
poteryannyj_atribut.py
class Sobaka:
    def __init__(self, klichka, vozrast):
        klichka = klichka      # это просто локальная переменная!
        self.vozrast = vozrast

rex = Sobaka("Рекс", 3)
print(rex.klichka)
Traceback (most recent call last):
  File "poteryannyj_atribut.py", line 7, in 
    print(rex.klichka)
AttributeError: 'Sobaka' object has no attribute 'klichka'
Что видно на экране

Строка klichka = klichka без self. слева создаёт обычную ЛОКАЛЬНУЮ переменную внутри __init__, которая исчезает, как только __init__ заканчивается — на объекте она никогда не сохранялась. Чтобы значение осталось частью объекта НАВСЕГДА, слева от = обязательно должно стоять self.имя_атрибута.

Исправленный код
atribut_ispravlen.py
class Sobaka:
    def __init__(self, klichka, vozrast):
        self.klichka = klichka
        self.vozrast = vozrast

rex = Sobaka("Рекс", 3)
print(rex.klichka)
Практика: __init__ и создание объекта
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →