¿Cómo se llama recursivamente a un constructor (__init__) en Python? [cerrado]

Mi pregunta es probablemente la más fácil de ver en el código. Me gustaría hacer lo siguiente

class A():
    def __init__(self, i):
        self.i = i
        if i > 0:
            self.a = A(i-1)

La idea es que quiero crear una clase de tipo A que pueda llamar recursivamente a su propio constructor. Si codifico lo anterior e intento crear una instancia de AI, obtengo lo siguiente:

a = Test(3)
--->  self.a = A(i-1)
NameError: global name 'A' is not defined

¿Es posible tener una clase que llame recursivamente a su propio constructor? Si es así, ¿Cómo se hace?

preguntado el 08 de noviembre de 11 a las 18:11

Su código funciona y no arroja un error. -

Su código funciona bien para mí en XP, usando python 2.7.1 -

Parece que le cambiaste el nombre A a Test, pero olvidé cambiarle el nombre en todas partes… -

2 Respuestas

Parece funcionar bien para mí cuando lo hago a = A(3), porque es el tuyo a = Test(3)? Supongo que ese es el problema, si nombraste a tu clase Test entonces deberías usar self.a = Test(i-1).

>>> class A():
...     def __init__(self, i):
...         self.i = i
...         if i > 0:
...             self.a = A(i-1)
... 
>>> a = A(3)
>>> a.i
3
>>> a.a.i
2
>>> a.a.a.i
1
>>> a.a.a.a.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute 'a'

respondido 08 nov., 11:22

¡Ajá! Resulta que obtengo exactamente el mismo resultado que usted cuando uso vainilla python. Estaba haciendo esto usando shell_plus en una aplicación django usando iPython. Resulta que el error estaba relacionado con mi entorno particular, no con Python en sí. ¡Gracias! - EliRibble

Para llamar de forma recursiva al "constructor" (en realidad, un inicializador; consulte aquí) tú haces:

class A():
    def __init__(self, i):
        self.i = i
        if i > 0:
           self.__init__(i-1)

Pero sospecho que eso no es lo que pretendes hacer. Su código de ejemplo está creando de forma recursiva instancias de tipo A y almacenarlos unos dentro de otros.

contestado el 23 de mayo de 17 a las 14:05

+1 para la mención "inicializador". - jldupont

Sí, mi publicación original no estaba del todo clara. De hecho, quiero crear instancias de forma recursiva; estoy construyendo algo así como una estructura de árbol. - EliRibble

¿Has probado esto? No creo que esto funcione. Intenté esto con la asignación en un dicty vuelve None en lugar de un objeto nuevo. Funciona bien si uso el ClassName(i-1) sintaxis en su lugar. - jonathan

@jonathan Si pega exactamente el código que le proporcioné, todo lo que hace es definir una clase (estilo antiguo) con un inicializador tonto. Si agrega una instanciación "a = A (10)", entonces el código se ejecuta y a se establece en una nueva instancia de A con su miembro "i" igual a 0. - Nathan

@ Nathan self.__init__ no puede ser una solución aceptable si regresa None cuando A(i-1) devuelve un valor y, como ya ha señalado, esta solución no directamente responder a la pregunta del OP. Mi comentario es específicamente para contrarrestar el "+1 de la mención del" inicializador ", ya que está fuera de lugar en este contexto. - jonathan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.