2012-05-30 8 views

risposta

17

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.

1

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.

0

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.

0

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> 
+10

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

+2

Questo è un grande pensiero. Memorizzando i risultati in una lista continua a creare oggetti diversi. –

+1

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

Problemi correlati