Почему __init__ не вызывается, если __new__ вызывается без аргументов - PullRequest
7 голосов
/ 01 августа 2011

Я пытаюсь создать (не совсем восстановить) объект, атрибуты которого сохранены в базе данных.Поэтому я не хочу звонить __init__.Это желание, по-видимому, согласуется с предполагаемым использованием Гвидо для __new__.Я не понимаю, почему __init__ не вызывается.

Возьмем, к примеру, следующий фрагмент, он возвращает экземпляр класса User без вызова __init__.

class User(object):
    def __init__(self, arg1, arg2):
        raise Exception

user = User.__new__(User)

print user
<project.models.User object at 0x9e2dfac>

Этоточное поведение, которое я хочу.Однако мой вопрос в том, что я не понимаю, почему?

Согласно документам на python __init__ должен вызываться, когда __new__ "возвращает экземпляр cls".

Так почему __init__ даже не вызывается, даже если __new__ возвращает экземпляр класса?

Ответы [ 2 ]

11 голосов
/ 01 августа 2011

Конструктор (User()) отвечает за вызов allocator (User.__new__()) и инициализатора (User.__init__()) по очереди.Поскольку конструктор никогда не вызывается, инициализатор никогда не вызывается.

10 голосов
/ 01 августа 2011

Поскольку вы обходите обычный строительный механизм, вызывая __new__ напрямую.Логика __init__ -after- __new__ находится в type.__call__ (в CPython см. Функцию typeobject.c, type_call), поэтому это происходит только тогда, когда вы выполните User(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...