Python: Всегда используйте __new__ вместо __init__?
-
01-10-2019 - |
Вопрос
Я понимаю, как оба __init__
а также __new__
работай. Мне интересно, есть ли что-нибудь __init__
могу сделать это __new__
не можем?
т.е. может использовать __init__
быть замененным на следующий рисунок:
class MySubclass(object):
def __new__(cls, *args, **kwargs):
self = super(MySubclass, cls).__new__(cls, *args, **kwargs)
// Do __init__ stuff here
return self
Я спрашиваю, как я бы хотел сделать этот аспект Python OO лучшего в моей голове.
Решение 2
Один возможный ответ от Guido's Post. (Спасибо @ fraca7):
Например, в модуле раскладки,
__new__
используется для создания экземпляров при неустойчивых объектах. В этом случае создаются экземпляры, но__init__
Метод не вызывается.
Любые другие подобные ответы?
Я принимаю этот ответ как «Да» к своему собственному вопросу:
Мне интересно, есть ли что-нибудь
__init__
могу сделать это__new__
не можем?
Да, в отличие от __new__
, действия, которые вы положили в __init__
Метод не будет выполнен во время неповторимого процесса. __new__
не может сделать это различие.
Другие советы
Итак, класс класса обычно type
, и когда вы звоните Class()
то __call__()
метод включения Class
Класс обрабатывает это. я верю type.__call__()
реализован более или менее так:
def __call__(cls, *args, **kwargs):
# should do the same thing as type.__call__
obj = cls.__new__(cls, *args, **kwargs)
if isinstance(obj, cls):
obj.__init__(*args, **kwargs)
return obj
Прямой ответ на ваш вопрос - нет, то, что __init__()
может сделать (изменить / «инициализировать» указанный экземпляр) - это подмножество вещей, которые __new__()
Можно сделать (создать или иным образом выбирать любой объект, который он хочет, сделай что-нибудь для этого объекта, который он хочет, прежде чем объект будет возвращен).
Однако удобно иметь как методы для использования. Использование __init__()
проще (ему не нужно ничего не создавать, это не нужно ничего вернуть), и я считаю, что это лучшая практика, чтобы всегда использовать __init__()
Если у вас нет конкретной причины использования __new__()
.
Ну, ищу __new__ vs __init__
в Google показал мне это.
Короче говоря, __new__
Возвращает новый экземпляр объекта, в то время как __init__
ничего не возвращается и просто инициализирует членов класса.
Редактировать: На самом деле ответить на ваш вопрос, вам никогда не нужно переопределять __new__
Если вы не подклассыя неизменные типы.