¿Es válido el siguiente código python?¿Puede una clase python devolver una nueva instancia de su clase?
class Test:
def __init__(self):
self.number = 5
def returnTest(self):
return Test()
¿Es válido el siguiente código python?¿Puede una clase python devolver una nueva instancia de su clase?
class Test:
def __init__(self):
self.number = 5
def returnTest(self):
return Test()
Sí, es válido. La clase está definida por el momento en que crea un objeto y llama al método returnTest
.
In [2]: x = Test()
In [3]: y = x.returnTest()
In [4]: y
Out[4]: <__main__.Test instance at 0x1e36ef0>
In [5]:
Sin embargo, en los casos en que un método actúa como una fábrica, es posible que desee considerar el uso de la decoradora classmethod. Cuando la herencia y otras molestias se interponen, esto puede ayudar.
Sí, es válido. returnTest
no se ejecutará hasta que se llame. No crea un bucle infinito, ya que el método no se invoca en el objeto recién creado.
Sí. Es un código python válido. Muchos lenguajes de programación permiten devolver una instancia de una clase que se está definiendo. Piense en el singleton patrón.
Sí, funciona pero parece que returnTest() es siempre la misma instancia de Test.
class Test:
def __init__(self):
self.number = 5
def returnTest(self):
return Test()
t = Test()
print t
print t.returnTest()
print t.returnTest()
$ python te.py
<__main__.Test instance at 0xb72bd28c>
<__main__.Test instance at 0xb72bd40c>
<__main__.Test instance at 0xb72bd40c>
Esto es cierto para Python 2.7 y 3.2. @classmethod no hizo la diferencia. Curiosamente, PyPy devuelve una instancia diferente cada vez:
$ pypy te.py
<__main__.Test instance at 0xb6dcc1dc>
<__main__.Test instance at 0xb6dcc1f0>
<__main__.Test instance at 0xb6dcc204>
Intente almacenar el resultado t.returnTest() porque si no lo hace, puede ser recolectado y puede parece a usted que la misma instancia se devuelve pero es solo la misma dirección, reciclada. – kasyc
Eso es una gran idea. Almacenar los resultados en una lista continúa creando diferentes objetos. –
Mi +1 a kasyc. Estoy usando Python 2.7.1 en Windows. Sin almacenar la referencia, también puedo observar la reutilización/reciclaje del espacio recogido de basura mencionado por kasyc. – pepr