Pregunta

entiendo cómo ambos __init__ y __new__ trabajo. Me pregunto si hay algo que puede hacer que __init__ __new__ no puede?

es decir. puede utilizar de __init__ ser reemplazado por el patrón siguiente:

class MySubclass(object):
    def __new__(cls, *args, **kwargs):
        self = super(MySubclass, cls).__new__(cls, *args, **kwargs)
        // Do __init__ stuff here
        return self

Yo te pido que me gustaría hacer este aspecto de Python OO encaja mejor en mi cabeza.

¿Fue útil?

Solución 2

Una posible respuesta de de guido publicar (gracias @ fraca7):

  

Por ejemplo, en el módulo de la salmuera, __new__ se utiliza para crear instancias cuando los objetos de revertir la seriación. En este caso, las instancias se crean, pero el método __init__ no se invoca.

Las demás respuestas similares?


que estoy aceptando esta respuesta como un 'sí' a mi propia pregunta:

  

Me pregunto si hay algo que puede hacer que __init__ __new__ no puede?

Sí, a diferencia de __new__, las acciones que se pone en el método __init__ no se lleva a cabo durante el proceso de desestibado. __new__ no puede hacer esta distinción.

Otros consejos

Por lo tanto, la clase de una clase es típicamente type, y cuando se llama al método Class() __call__() en los mangos de la clase que Class. Creo type.__call__() se lleva a cabo más o menos así:

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

La respuesta directa a su pregunta no es, las cosas que __init__() puede hacer (/ cambio de "inicialización" una instancia especificada) es un subconjunto de las cosas que __new__() puede hacer (crear u seleccionar cualquier objeto que quiere, hace nada a ese objeto que quiere antes de devolver el objeto).

Es conveniente tener ambos métodos para su uso, sin embargo. El uso de __init__() es más simple (que no tiene que crear nada, que no tiene que devolver nada), y creo que la mejor práctica es utilizar siempre __init__() a menos que tenga una razón específica para su uso __new__().

Bueno, en busca de __new__ vs __init__ en Google me mostró este .

Para acortar una larga historia, __new__ devuelve una nueva instancia del objeto, mientras que los retornos __init__ nada y simplemente inicializa miembros de la clase.

EDIT:. Para responder a su pregunta en realidad, nunca se debe necesitar __new__ anulación a no ser que se subclassing tipos inmutables

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top