Методи __new__ та __init__ відіграють важливу роль під час створення та ініціалізації об’єктів у Python, але мають відмінності у своєму застосуванні.

Метод __new__

Метод __new__ – це статичний метод (тобто належить самому класу), котрий відповідає за процес створення та повернення нового екземпляра класу. В якості першого аргументу __new__ отримує сам клас (cls), після чого слідують додаткові аргументи:

class Person:

    def __new__(cls, *args, **kwargs):
        instance = super().__new__(cls)
        return instance

Метод __new__ викликається перед методом __init__, і може використовуватись при потребі контролювати процес створення об’єктів (наприклад реалізація шаблону singleton, або керування кешуванням об’єктів).

Метод __init__

Метод __init__ є методом екземпляра класу, та відповідає за ініціалізацію новоствореного об’єкта. Метод __init__ викликається після __new__, отримуючи в якості першого аргументу новостворений екземпляр (self), за яким йдуть додаткові аргументи. __init__ визначає та ініціалізує змінні екземпляру:

class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

Відмінність між методами __new__ та __init__

__new____init__
статичний методметод екземпляру
першим аргументом приймає клас (cls)першим аргументом приймає екземпляр класу (self)
відповідає за створення та повернення нового об’єктувідповідає за ініціалізацію атрибутів новоствореного об’єкту
виконується перед __init__виконується після __new__
повертає новостворений екземпляр класуне повертає жодного значення, лише ініціалізує переданий йому об’єкт

Приклад __new__ та __init__ методів в класі

В прикладі нижче можна побачити, що метод __new__ викликається перед методом __init__, під час створення та ініціалізації об’єкта Person:

class Person:

    def __new__(cls, name, age):
        print('Creating a new Person object')
        instance = super().__new__(cls)
        return instance

    def __init__(self, name, age):
        print('Initializing the Person object')
        self.name = name
        self.age = age


person = Person('Nicky Sharp', 28)
print(f'Person name: {person.name}, age: {person.age}')

Результат виконання:

Creating a new Person object
Initializing the Person object
Person name: Nicky Sharp, age: 28


Мітки: