← Назад к вопросам

Что возвращает __init__ в Python?

2.0 Middle🔥 111 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что возвращает init в Python

init ничего не возвращает (или точнее, возвращает None). Метод init — это инициализатор, который предназначен для настройки объекта после его создания, а не для создания нового объекта.

Роль init в жизненном цикле объекта

В Python при создании объекта происходит следующее:

  1. new — создает новый экземпляр класса
  2. init — инициализирует созданный экземпляр
  3. Объект готов к использованию
class User:
    def __new__(cls, name):
        print(f"__new__ вызван, создаём объект")
        instance = super().__new__(cls)  # Создаём экземпляр
        return instance  # __new__ ВОЗВРАЩАЕТ объект
    
    def __init__(self, name):
        print(f"__init__ вызван для инициализации")
        self.name = name
        # __init__ не возвращает ничего

user = User("Alice")
# __new__ вызван, создаём объект
# __init__ вызван для инициализации
print(f"User: {user.name}")  # User: Alice

init всегда возвращает None

class Person:
    def __init__(self, name):
        self.name = name
        # Неявно возвращает None

p = Person("Bob")
result = p.__init__("Charlie")  # Вызвали __init__ напрямую
print(result)  # None
print(type(result))  # <class 'NoneType'>

Если явно вернуть что-то из init, получишь ошибку

class BadExample:
    def __init__(self, value):
        self.value = value
        return self.value  # ОШИБКА!

# TypeError: __init__() should return None, not int

Python запретит вернуть что-то кроме None из init:

class AnotherBadExample:
    def __init__(self, name):
        self.name = name
        return "something"  # TypeError

# TypeError: __init__() should return None, not str

Отличие init от new

new создает объект и ВОЗВРАЩАЕТ его

class Product:
    def __new__(cls, name):
        # __new__ ДОЛЖЕН вернуть новый экземпляр
        instance = super().__new__(cls)
        print(f"Created: {instance}")
        return instance  # Возвращаем новый объект
    
    def __init__(self, name):
        # __init__ инициализирует объект
        self.name = name
        print(f"Initialized: {self.name}")
        # Не возвращаем ничего

p = Product("Laptop")
# Created: <__main__.Product object at 0x...>
# Initialized: Laptop

init только инициализирует и ВОЗВРАЩАЕТ None

class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
        self.speed = 0
        # Никакого return

car = Car("Toyota", "Camry")
print(car.brand)  # Toyota
print(car.model)  # Camry

Практический пример

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance
        self.transactions = []
        print(f"Счёт создан для {owner}")
        # __init__ не возвращает значение
    
    def deposit(self, amount):
        self.balance += amount
        self.transactions.append(("deposit", amount))
        return self.balance  # Это метод, он может возвращать
    
    def __str__(self):
        return f"Account({self.owner}, {self.balance})"

account = BankAccount("Alice", 1000)
# Счёт создан для Alice

# __init__ не возвращает ничего, но объект создан
print(account)  # Account(Alice, 1000)

# Другие методы могут возвращать значения
new_balance = account.deposit(500)
print(new_balance)  # 1500

Когда вызывается init

class Student:
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
        print(f"Student {name} initialized")

# __init__ вызывается автоматически при создании объекта
s1 = Student("Alice", "A")  # Student Alice initialized
s2 = Student("Bob", "B")    # Student Bob initialized

# Можно вызвать __init__ вручную на существующем объекте
# (но это редко делают)
s1.__init__("Charlie", "C")  # Student Charlie initialized
print(s1.name)  # Charlie (переинициализировали)

Что происходит при создании объекта

class Example:
    def __new__(cls):
        print("1. __new__ создает объект")
        return super().__new__(cls)
    
    def __init__(self):
        print("2. __init__ инициализирует объект")

obj = Example()
# 1. __new__ создает объект
# 2. __init__ инициализирует объект

# Результат: obj — это готовый объект Example

Распространенная ошибка

# НЕПРАВИЛЬНО: пытаемся использовать return в __init__
class Calculator:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        return self.a + self.b  # TypeError!

# TypeError: __init__() should return None, not int

# ПРАВИЛЬНО: создаём метод для вычисления
class Calculator:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    
    def add(self):
        return self.a + self.b  # Метод может возвращать

calc = Calculator(5, 3)
result = calc.add()
print(result)  # 8

Сравнение init и обычных методов

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
        # Не возвращает ничего
    
    def area(self):
        # Это обычный метод, может возвращать
        return self.width * self.height
    
    def perimeter(self):
        # Может возвращать
        return 2 * (self.width + self.height)
    
    def info(self):
        # Может не возвращать
        print(f"Rectangle: {self.width}x{self.height}")

rect = Rectangle(4, 5)
print(rect.area())      # 20 (возвращает)
print(rect.perimeter()) # 18 (возвращает)
rect.info()             # Rectangle: 4x5 (не возвращает)

Почему init не возвращает значение

  1. Объект уже созданinit не создает объект, он его инициализирует
  2. Сложность — если init возвращал объект, это было бы путанно
  3. Стандарт Python — это установленное правило языка
  4. Гарантия — мы всегда знаем, что переменная содержит объект класса

Заключение

init ВСЕГДА возвращает None. Это не метод для создания объекта, а метод для инициализации уже созданного объекта. Объект создается new, а init только настраивает его атрибуты. Попытка вернуть что-либо из init приведет к TypeError.