Я заинтересован в использовании функциональности __new__
для ввода кода в функцию подклассов __init__
. Мое понимание из документации заключается в том, что python вызовет __init__
на экземпляр, возвращенный __new__
. Тем не менее, мои попытки изменить значение __init__
в экземпляре, прежде чем возвращать его с __new__
, похоже, не сработают.Использование __new__ для переопределения __init__ в подклассе
class Parent(object):
def __new__(cls, *args, **kwargs):
new_object = super(Parent, cls).__new__(cls)
user_init = new_object.__init__
def __init__(self, *args, **kwargs):
print("New __init__ called")
user_init(self, *args, **kwargs)
self.extra()
print("Replacing __init__")
setattr(new_object, '__init__', __init__)
return new_object
def extra(self):
print("Extra called")
class Child(Parent):
def __init__(self):
print("Original __init__ called")
super(Child, self).__init__()
c = Child()
Приведенный выше код печатает:
Replacing __init__
Original __init__ called
, но я ожидал бы, чтобы напечатать
Replacing __init__
New __init__ called
Original __init__ called
Extra called
Почему нет?
Я чувствую, что Python вызывает исходное значение __init__
, независимо от того, что я установил в __new__
. Выполнение интроспекции на c.__init__
показывает, что новая версия на месте, но она не была вызвана как часть создания объекта.
Что вы думаете? – cat