Глава 14 · Создаём объекты реального мира
__init__ и создание объекта
__init__ не создаёт объект — он настраивает объект, который уже существует.
Что на самом деле происходит при Sobaka("Рекс", 3)
Частое заблуждение: «__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, без установки