Методы класса __init__() и __new__(), инициализация объектов | Вопросы для собеседования | Skilio
Методы класса __init__() и __new__(), инициализация объектов
Вопрос:

Какое назначение метода __init__() в Python? Как его использовать в определении класса?

В чем разница между методами __init__() и __new__()?

Подсказки:

  • Подумайте, что происходит при создании нового экземпляра класса.
  • Учтите, как обычно настраиваются или инициализируются атрибуты объекта.

Выше ожиданий:

  • Порядок разрешения методов (MRO), использование функции super() в __init__()
  • Паттерны инициализации при множественном наследовании
  • Знает про дескрипторы и инициализацию
Ответ:

Каково назначение метода __init__() в Python?

Метод __init__() — это специальный метод-конструктор в классах Python, который инициализирует новые экземпляры объектов. Он выполняется автоматически при создании нового объекта из класса.

Основные цели __init__():

  1. Установка начальных значений атрибутов объекта
  2. Выполнение операций настройки, необходимых при создании объектов
  3. Прием параметров, которые настраивают создание объекта

Использование __init__() в определении класса

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.skills = []  # Атрибут по умолчанию

При использовании метод автоматически выполняется: person = Person("Alice", 30)

Разница между __init__() и __new__()

  • __new__(): Отвечает за создание и возврат нового экземпляра класса.
  • __init__(): Отвечает за инициализацию уже созданного экземпляра.

Порядок выполнения:

  1. __new__() создает и возвращает экземпляр
  2. __init__() получает этот экземпляр (как self) и инициализирует его.

Метод __new__() редко переопределяется, за исключением:

  • Создание синглтон-классов
  • Наследование от неизменяемых типов
  • Реализация поведения метаклассов

Использование метода __new__() для паттерна Singleton

class Singleton:
    _instance = None
    
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance
        
    def __init__(self, name):
        self.name = name

Продвинутые шаблоны инициализации

Использование super() с __init__()

class Child(Parent):
    def __init__(self, name, age, school):
        super().__init__(name, age)  # Инициализация родительского класса
        self.school = school

Множественное наследование

Python использует порядок разрешения методов (MRO) для определения, методы какого родительского класса вызывать в первую очередь при множественном наследовании. Функция super() автоматически следует этому порядку.

Дескрипторы и инициализация

Дескрипторы могут контролировать доступ к атрибутам во время инициализации. Они определяют методы __get__, __set__, и __delete__, которые перехватывают операции с атрибутами, позволяя выполнять валидацию и вычислять свойства во время процесса инициализации.

0
Python Средний Опубликовано
© Skilio, 2025
Условия использования
Политика конфиденциальности
Мы используем файлы cookie, для персонализации сервисов и повышения удобства пользования сайтом. Если вы не согласны на их использование, поменяйте настройки браузера.