Python: utilizar siempre __new__ en lugar de __init__?
-
01-10-2019 - |
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.
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