Zanurkuj w Pythonie/Tworzenie instancji klasy: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Robwolfe (dyskusja | edycje)
Nie podano opisu zmian
Linia 1:
{{Podświetl|py}}
== Tworzenie instancji klasy ==
InicjalizowanieTworzenie klasyinstancji klas jest dosyć proste. W tym celu wywołujemy klasę tak jak by była funkcją, dodając odpowiednie argumenty, które są określone w metodzie <tt>__init__</tt>. Zwracaną wartością będzie zawsze nowo utworzony obiekt.
 
'''Przykład 5.7. Tworzenie instacji klasy FileInfo'''
Linia 13:
{'name': '/music/_singles/kairo.mp3'}
 
# Utworzyliśmy instancję klasy FileInfo (zdefiniowaną w module <tt>fileinfo</tt>) i przypisaliśmy właśnie utworzony obiekt do zmiennej <tt>f</tt>. Użyliśmy jednego parametru <tt>/music/_singles/kairo.mp3</tt>, który będzie odpowiadał za argumentargumentowi <tt>filename</tt> w metodzie <tt>__init__</tt> klasy FileInfo.
# Każda instancja pewnej klasy ma wbudowany atrybut <tt>__class__</tt>, który jest klasą danego obiektu. (Dodajmy, że ta reprezentacja dołącza fizyczny adres instancji na moim komputerze, na twoim reprezentacja będzie się różniła) Programiści Javy mogą być zaznajomieni z klasą <tt>Class</tt>, która posiada metody takie jak <tt>getName</tt> czy <tt>getSuperclass</tt>, aby pobrać metadane o pewnym obiekcie. W Pythonie, dzieckoten rodzaj metadadanych, jest dostępnedostępny bezpośrednio z obiektu wykorzystując atrybuty takie jak <tt>__class__</tt>, <tt>__name__</tt>, czy <tt>__bases__</tt>.
# Możesz pobrać notkę dokumentacyjną w podobny sposób jak funkcjęto czyniliśmy w przypadku funkcji czy modułmodułu. Wszystkie instancje klasy mająwspółdzielą taką samą informacjęnotkę dokumentacyjną.
# Pamiętamy, że metoda <tt>__init__</tt> przypisuje argument <tt>filename</tt> do self["name"]? W tym miejscu mamy wynik. Argumenty podawane podczas tworzenia instancji pewnej klasy zostają wysyłanewysłane do metody <tt>__init__</tt> (poza referencją do obiektu (argument, który nazwaliśmy <tt>self</tt>), Python zrobił to za nas).
 
{{Infobox|
Linia 38:
Technicznym terminem tego sposobu odśmiecania pamięci jest „zliczanie odwołań”. Python przechowuje listę referencji do każdej utworzonej instancji. W powyższym przykładzie, mamy tylko jedną referencję do instancji <tt>FileInfo</tt> -- zmienną <tt>f</tt>. Kiedy funkcja się kończy, zmienna <tt>f</tt> wychodzi poza zakres, więc licznik odwołań zmiejsza się do <tt>0</tt> i Python niszczy tę instancję automatycznie.
 
W poprzednich wersjach Pythona występowały sytuacje, gdy zliczanie odwołań zawodziło i Python nie mógł wyczyścić po nas pamięci. Jeśli tworzyłeś dwie instancjęinstancje, które odwoływały się do siebie nawzajem (np. instancja listy dwukierunkowej (ang. double linked list), w których każdy węzeł wskazuje na poprzedni i następny znajdujący się w liście), żadna instancja nie była niszczona automatycznie, ponieważ Python uważał (poprawnie), że ciągle mamy referencję do każdej instancji. Od Pythonie 2.0 mamy dodatkowy sposób odśmiecania pamięci nazywany po ang. “mark-and-sweep” (znacz i zamiataj), dzięki któremu w sprytny sposób Python odnajduje różne wirtualne blokady i poprawnie czyści referencje tworzące cykl.
 
Podsumowując w języku tym można po prostu zapomnieć o zarządzaniu pamięcią i pozostawić tę sprawę Pythonowi.