È valido il seguente codice Python?Una classe python può restituire una nuova istanza della sua classe?
class Test:
def __init__(self):
self.number = 5
def returnTest(self):
return Test()
È valido il seguente codice Python?Una classe python può restituire una nuova istanza della sua classe?
class Test:
def __init__(self):
self.number = 5
def returnTest(self):
return Test()
Sì, è valido. La classe è definita dal momento in cui si crea un oggetto e si chiama il metodo returnTest
.
In [2]: x = Test()
In [3]: y = x.returnTest()
In [4]: y
Out[4]: <__main__.Test instance at 0x1e36ef0>
In [5]:
Tuttavia, nei casi in cui un metodo agisce come una fabbrica, si potrebbe voler considerare l'uso del classmethod decoratore. Quando ereditarietà e altri fastidi si intromettono, questo può aiutare.
Sì, è valido. returnTest
non verrà eseguito fino a quando non viene chiamato. Non crea un ciclo infinito, poiché il metodo non viene richiamato sull'oggetto appena creato.
Sì. È un codice Python valido. Molti linguaggi di programmazione consentono di restituire un'istanza di una classe in fase di definizione. Pensa al modello singleton.
Sì, funziona ma sembra che returnTest() sia sempre la stessa istanza di 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>
Questo vale per Python 2.7 e 3.2. @classmethod non ha fatto la differenza. È interessante notare che, PyPy restituisce un'istanza diverso ogni volta:
$ pypy te.py
<__main__.Test instance at 0xb6dcc1dc>
<__main__.Test instance at 0xb6dcc1f0>
<__main__.Test instance at 0xb6dcc204>
Prova memorizzare il risultato t.returnTest(), perché se non lo fai così, può essere garbage collection e può sembra che la stessa istanza viene restituito ma è solo lo stesso indirizzo, riciclato. – kasyc
Questo è un grande pensiero. Memorizzando i risultati in una lista continua a creare oggetti diversi. –
Il mio +1 in kasyc. Sto usando Python 2.7.1 su Windows. Senza memorizzare il riferimento, posso anche osservare il riutilizzo/riciclaggio dello spazio raccolto dalla spazzatura menzionato da kasyc. – pepr