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.