Czy następujący kod Pythona jest prawidłowy?Czy klasa Pythona może zwrócić nową instancję klasy?
class Test:
def __init__(self):
self.number = 5
def returnTest(self):
return Test()
Czy następujący kod Pythona jest prawidłowy?Czy klasa Pythona może zwrócić nową instancję klasy?
class Test:
def __init__(self):
self.number = 5
def returnTest(self):
return Test()
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.
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.
Tak. Jest to poprawny kod Pythona. Wiele języków programowania pozwala na zwrócenie instancji definiowanej klasy. Pomyśl o wzorze singleton.
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>
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
To wspaniała myśl. Przechowywanie wyników na liście nadal tworzy różne obiekty. –
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