Zanurkuj w Pythonie/Metody specjalne: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
mNie podano opisu zmian |
tłumaczenie |
||
Linia 1:
{{Podświetl|py}}
== Pobieranie i ustawianie elementów ==
Linia 38 ⟶ 39:
# Ta linia wygląda jak użycie słownika. Tylko, że <tt>f</tt> jest obiektem klasy próbującej udawać słownik a metoda <tt>__stitem__</tt> jest ważną częścią tej maskarady. Ta linia kodu powoduje właściwie wywołanie <tt>f.__setitem__("genre", 32)</tt>.
<tt>__setitem__</tt> jest metodą specjalną, ponieważ Python wywołuje ją za Ciebie, ale ciągle jest metodą klasy. Tak
Koncepcja ta jest prostotą całego szkieletu, który analizujemy w tym rozdziale. Każdy plik może posiadać własną klasę obsługi, która wie, w jaki sposób pobrać dane z różnych typów plików. Natychmiast po pobraniu niektórych atrybutów (jak nazwa pliku i lokacja), które znamy, klasa obsługi będzie wiedziała, jak otrzymać dalsze atrybuty automatycznie. Możemy to zrobić poprzez nadpisanie metody <tt>__setitem__</tt> method, sprawdzenie poszczególnych kluczy i wykonywanie dodatkowych operacji, jeśli dany klucz zostanie znaleziony.
'''
def __setitem__(self, key, item): #(1)
if key == "name" and item: #(2)
Linia 50 ⟶ 51:
FileInfo.__setitem__(self, key, item) #(4)
# Zauważmy, że <tt>__setitem__</tt> jest definiowany w identyczny sposób, jak w klasie przodka. Jest to ważne, ponieważ Python będzie wywoływał tę metodą oczekując odpowiedniej liczby argumentów.(Ściśle mówiąc, nazwy argumentów nic nie znaczą, ważna jest ich ilość.)
# W tym miejscu jest klucz klasy całej klasy <tt>MP3FileInfo</tt>: jeśli przypisujesz pewną wartość do klucza <tt>"name"</tt>, chcesz wykonać dodatkowo pewne operacje.
# Dodatkowe operacje dla klucza <tt>"name"</tt> zawarte są w metodzie <tt>__parse</tt>. Jest to inna metoda klasy <tt>MP3FileInfo</tt> i kiedy ją wywołujemy, używamy przy tym zmiennej <tt>self</tt>. Wywołując samo <tt>__parse</tt> odnosimy się do normalnej funkcji, która jest zdefiniowana poza klasą, a tego nie chcemy wykonać. Kiedy natomiast wywołamy <tt>self.__parse</tt> będziemy odnosić się do metody znajdującej się wewnątrz klasy. Nie jest to niczym nowym. W identyczny sposób odnosimy się do atrybutów klasy.
# Po wykonaniu tej dodatkowej operacji, chcemy wykonać metodę przodka. Zapamiętaj to co niegdny nie będzie dla ciebie zrobione w Pythonie: musisz to zrobić manualnie. Zwróć uwagę na to, że odwołujemy się bezpośrednio przodka, czyli <tt>FileInfo</tt>, chociaż on nie posiada żadnej metody o nazwie <tt>__setitem__</tt>. Jednak wszystko jest w porządku, ponieważ Python będzie szedł po przodkach jeszcze wyżej dopóki nie znajdzie klasy, która posiada metodę, którą wywołujemy. Tak więc ta linia kodu znajdzie i wywoła metodę <tt>__setitem__</tt> zdefiniowaną w klasie <tt>UserDict</tt>.
{{Infobox|
Kiedy odwołujesz się do danych zawartych w atrybucie klasy, musisz określić nazwę atrybutu np. <tt>self.attribute</tt>. Podczas wywoływania metody klasy, musisz określić nazwę metody np. <tt>self.method</tt>.
}}
'''Przykład 5.15. Ustawianie <tt>"name"</tt> w <tt>MP3FileInfo</tt>'''
>>> import fileinfo
Linia 75 ⟶ 77:
'comment': 'http://mp3.com/cynicproject'}
#
#
#
<noinclude>
|