Когда (и почему) была введена функция Python __new__()
?
Существует три шага по созданию экземпляра класса, например, MyClass()
:
MyClass.__call__()
называется.Этот метод должен быть определен в метаклассе MyClass
. MyClass.__new__()
вызывается (__call__
).Определено на MyClass
.Это создает экземпляр. MyClass.__init__()
вызывается (также __call__
).Это инициализирует экземпляр.
На создание экземпляра может повлиять либо перегрузка __call__
, либо __new__
.Обычно нет особых причин перегружать __call__
вместо __new__
(например, Использование метода метакласса __call__ вместо __new __? ).
У нас есть старый код (все еще работающийсильный!) где __call__
перегружен.Причина была в том, что __new__
не было доступно в то время.Поэтому я попытался узнать больше об истории как Python, так и нашего кода, но я не мог понять, когда был введен __new__
.
__new__
появляется в документации для Python 2.4 и не в тех для Python 2.3 , но он не появляется в whathsnew любой из версий Python 2.Первый коммит , который ввел __new__
(Слияние descr-branch обратно в trunk.), Который я смог найти, относится к 2001 году, но сообщение «back to trunk» является признаком того, что что-то было раньше. PEP 252 (создание типов, более похожих на классы) и PEP 253 (подтипы встроенных типов) из нескольких месяцев ранее, кажется, имеют значение.
Изучениео введении __new__
мы узнаем больше о том, почему Python такой, какой он есть.
Редактировать для пояснения:
Кажется, что class.__new__
дублирует функциональность, которая уже естьпредоставлено metaclass.__call__
.Кажется неуместным добавлять метод только для лучшей репликации существующих функций.
__new__
- это один из немногих методов класса, которые вы получаете из коробки (то есть с cls
в качестве первогоаргумент), тем самым вводя сложность, которой не было раньше.Если класс является первым аргументом функции, то можно утверждать, что функция должна быть обычным методом метакласса.Но этот метод уже существовал: __call__()
.Я чувствую, что что-то упустил.
Должен быть один - и желательно только один - очевидный способ сделать это.