2010-01-27 18 views
9

Se llama a la función __init__() cuando se crea el objeto. ¿Está bien llamar de nuevo a un objeto __init__() una vez creado?Python: múltiples llamadas a __init __() en la misma instancia

instance = cls(p1=1, p2=2) 
# some code 
instance.__init__(p1=123, p2=234) 
# some more code 
instance.__init__(p1=23, p2=24) 

¿Por qué alguien quiere __init__() llamada en un objeto que está ya creado?

buena pregunta. Quiero volver a inicializar los campos de la instancia.

+1

Este es un diseño terrible. La gente que intente leer y mantener tu código quedará desconcertada. Por favor use métodos ordinarios con nombres comunes. Haga que '__init__' llame a otro método (por ejemplo,' reset') para que quede claro lo que está sucediendo. –

Respuesta

10

Puede llamar al __init__ más de una vez en un objeto, siempre que __init__ esté codificado con el efecto que desea obtener (cualquiera que sea). Un caso típico donde sucede (¡así que mejor código __init__ apropiadamente! -) es cuando el método __new__ de su clase devuelve una instancia de la clase: que hace causa que se llame a __init__ en la instancia devuelta (para lo que podría ser segunda, o vigésima vez, si mantiene instancias de "reciclaje" a través de su __new__! -).

1

Por lo que yo sé, que no causa ningún problema (edición: como lo sugiere el uso kosher de super(...).__init__(...)), pero creo que tener un método reset() y decir que es tanto en __init__() y cuando es necesario restablecer estaría más limpio.

3

Puedes, pero está un poco romper lo que __init__ está destinado a hacer. Gran parte de Python es realmente una convención, por lo que es mejor seguirlo y esperar que __init__ solo se llame una vez. Recomiendo crear una función llamada init o reset o algo que establezca las variables de instancia, use eso cuando quiera restablecer la instancia, y tenga __init__ simplemente llame al init. Esto definitivamente se ve más sano:

x = Pt(1,2) 
x.set(3,4) 
x.set(5,10) 
+0

+1: no llame a '__init__'. Viola las expectativas de todos los que leen y mantienen su código. Es simplemente un mal diseño. –

Cuestiones relacionadas