Продолжаю отвечать на вопросы, которые могут задать на собеседовании Python-разработчику.

Итак, в чем разница между __new__ и __init__ ? Разберемся с этим на примере кода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A(object):
    _dict = dict()

    def __new__(cls):
        if 'key' in A._dict:
                print "EXISTS"
                return A._dict['key']
        else:
                print "NEW"
                return super(A, cls).__new__(cls)

    def __init__(self):
        print "INIT"
        A._dict['key'] = self
        print ""

a1 = A()
a2 = A()
a3 = A()

Результатом работы скрипта будет вывод:

NEW
INIT

EXISTS
INIT

EXISTS
INIT

Мы видим, что __init__ вызывается после __new__, т.к. __new__ — классовый метод, переопределив который можно контролировать процесс создания нового экземпляра класса, именно его (экземпляр) либо None и возвращает __new__. __init__ же ничего не возвращает, он только отвечает за инициализацию созданного экземпляра.

ООП на Питоне