Вопрос

Я понимаю, как оба __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__ Если вы не подклассыя неизменные типы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top