2012-10-11 28 views
5

Entiendo lo que __new__ hace (y cómo es diferente de __init__) por lo que no estoy interesado en las definiciones, me interesa saber cuándo y cómo usar __new__.¿Cuáles son los casos de uso para __new__ de Python?

La documentación dice:

En general, no debería ser necesario para anular __new__ a menos que estés subclasificación de un tipo inmutable como str, int, unicode o tuple

Pero lo que pueda No piense en otros casos para usar __new__ o cómo usarlo correctamente (por ejemplo cuando se subclasifica un tipo inmutable o por qué es necesario en este caso).

Entonces, cuándo, por qué y cómo necesita usar __new__?

Me interesan los casos de uso, no lo que hace (sé lo que hace).

+2

@McFarlane: Sé que me interesan las situaciones en las que necesitas usar __new__ (más que la frase de "crear subclase de un tipo inmutable". ** Esto no es un duplicado. ** – JohnDoDo

+1

@close votantes Esto no es un duplicado. La pregunta a la que se hace referencia pregunta * por qué '__init__' siempre se invoca después de' __new__' * (no lo es). Esta pregunta requiere casos prácticos para '__new__'. Una respuesta para esta pregunta no es una respuesta para esa pregunta. –

+0

@lazyr: espero que no te importe, incorporé tu comentario a la pregunta. ¡Gracias! – JohnDoDo

Respuesta

10

Respondiendo a mí, yo he utilizado para

  • crear un patrón Singleton (aunque hay ways para hacer eso sin usar __new__)
  • dynamically extend classes from external modules sin editar en realidad la fuente
  • clases Personalizar en una metaclase (aunque también se puede usar __call__)
  • amplía la clase datetime.datetime (que es inmutable) para devolver la hora actual si se la instancia sin argumento mentos y el resultado de llamar strptime en el argumento de si se llama con un único argumento de cadena

Usted necesita __new__ cuando la subclasificación de un tipo inmutable si desea alterar los argumentos utilizados para construir el inmutable, ya que quería en el datetime ejemplo, o si no desea llamar al padre __new__ en absoluto, pero devuelve una instancia creada de otra manera o incluso de un tipo completamente diferente. En el momento en que está en __init__ es demasiado tarde para modificar el objeto de alguna manera, por lo que debe hacerlo en __new__.

+0

¡Muchas gracias por esto! – JohnDoDo

0

Un posible caso de uso podría ser una "clase de fábrica" ​​que devuelve instancias de varias clases según la implementación.

Cuestiones relacionadas