2012-05-30 22 views

Odpowiedz

17

Tak, jest ważny. Klasa jest definiowana przez czas utworzenia obiektu i wywołania metody returnTest.

In [2]: x = Test() 

In [3]: y = x.returnTest() 

In [4]: y 
Out[4]: <__main__.Test instance at 0x1e36ef0> 

In [5]: 

Jednak w przypadkach, gdy metoda działa jak fabryka, warto rozważyć użycie classmethod dekorator. Kiedy przeszkadza im dziedziczenie i inne kłopoty, może to pomóc.

1

Tak, jest ważny. returnTest nie zostanie uruchomiony, dopóki nie zostanie wywołany. Nie tworzy nieskończonej pętli, ponieważ metoda nie jest wywoływana na nowo utworzonym obiekcie.

0

Tak. Jest to poprawny kod Pythona. Wiele języków programowania pozwala na zwrócenie instancji definiowanej klasy. Pomyśl o wzorze singleton.

0

Tak, działa, ale wygląda na to, że returnTest() jest zawsze tym samym wystąpieniem testu.

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> 

Dotyczy to Python 2.7 i 3.2. @classmethod nie zrobił różnicy. Co ciekawe, pypy zwraca innej instancji za każdym razem:

$ pypy te.py 
<__main__.Test instance at 0xb6dcc1dc> 
<__main__.Test instance at 0xb6dcc1f0> 
<__main__.Test instance at 0xb6dcc204> 
+10

Spróbuj przechowywania t.returnTest (wynik), bo jeśli tego nie zrobisz tak, to mogą być zbierane śmieci i to może wydaje ci się, że ta sama instancja jest zwracany, ale jest to tylko ten sam adres, który został poddany recyklingowi. – kasyc

+2

To wspaniała myśl. Przechowywanie wyników na liście nadal tworzy różne obiekty. –

+1

Mój +1 do kasyc. Używam Python 2.7.1 w systemie Windows. Nie przechowując odniesienia, mogę także obserwować ponowne użycie/recykling śmieci zebranych przez firmę kasyc. – pepr

Powiązane problemy