Zanurkuj w Pythonie/Metody specjalne: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Linia 77:
'comment': 'http://mp3.com/cynicproject'}
 
# Najpierw tworzysz instancję klasy <tt>MP3FileInfo</tt> pomijając nazwę pliku. (Możemy tak zrobić, ponieważ argument <tt>filename</tt> funkcji <tt>__init__</tt> jest opcjonalny.) Ponieważ <tt>MP3FileInfo</tt> nie posiada własnej metody <tt>__init__</tt>, Python idzie wyżej po drzewie przodków i znajduje metodąmetodę <tt>__init__</tt> w klasie <tt>FileInfo</tt>. Z kolei <tt>__init__</tt> w tej klasie manualnie wykonuje metodę <tt>__init__</tt> w klasie <tt>UserDict</tt>, a potem ustawia klucz <tt>"name"</tt> na <tt>filename</tt>, który wynosi <tt>None</tt>, ponieważ pominęliśmy nazwę pliku. Ostatecznie <tt>mp3file</tt> początkowo przypomina słownik z jednym kluczem <tt>"name"</tt>, którego wartość wynosi <tt>None</tt>.
# Teraz rozpoczyna się prawdziwa zabawa. Ustawiając klucz <tt>"name"</tt> w <tt>mp3file</tt> powoduje wywołanie metody <tt>__setitem__</tt> klasy <tt>MP3FileInfo</tt> (nie <tt>UserDict</tt>), która zauważa, że ustawiamy klucz <tt>"name"</tt> z prawdziwą wartością i wywołuje <tt>self.__parse</tt>. Chociaż jeszcze nie śledziliśmy działania metody <tt>__parse</tt>, możemy po wyjściu zobaczyć, że ustawia ona kilka innych kluczy jak <tt>"album"</tt>, <tt>"artist"</tt>, <tt>"genre"</tt>, <tt>"title"</tt>, <tt>"year"</tt>, czy też <tt>"comment"</tt>.
# Zmieniając klucz <tt>"name"</tt> będziemy wykonywali ten sam proces podobnie. Python wywoła <tt>__setitem__</tt>, który następnie wywoła <tt>self.__parse</tt>, a ten ustawi wszystkie inne klucze.