python new-style-class

Python: siempre usa__new__ en lugar de__init__?



new-style-class (3)

Bueno, buscar __new__ vs __init__ en google me mostró this .

En pocas palabras, __new__ devuelve una nueva instancia de objeto, mientras que __init__ no devuelve nada y solo inicializa los miembros de la clase.

EDITAR: Para responder realmente a su pregunta, nunca debería tener que anular __new__ menos que esté subclasificando tipos inmutables.

Entiendo cómo funcionan tanto __init__ como __new__ . Me pregunto si hay algo que __init__ pueda hacer que __new__ no pueda?

es decir, el uso de __init__ puede reemplazarse por el siguiente patrón:

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

Estoy preguntando porque me gustaría que este aspecto de Python OO encajara mejor en mi cabeza.


Por lo tanto, la clase de una clase suele ser de type , y cuando llama a Class() el __call__() en la Class de Class maneja. Creo que el type.__call__() se implementa 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 es no, las cosas que __init__() puede hacer (cambiar / "inicializar" una instancia específica) es un subconjunto de las cosas que __new__() puede (crear o seleccionar el objeto que desee, hacer cualquier cosa a ese objeto que desee antes de que se devuelva el objeto).

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


Una posible respuesta de la publicación de guido (gracias @ fraca7):

Por ejemplo, en el módulo pickle, __new__ se utiliza para crear instancias al deserializar objetos. En este caso, se crean instancias, pero el método __init__ no se invoca.

¿Alguna otra respuesta similar?

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

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

Sí, a diferencia de __new__ , las acciones que pones en el método __init__ no se realizarán durante el proceso de descifrado. __new__ no puede hacer esta distinción.