Методи __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