Zanurkuj w Pythonie/Klasa opakowująca UserDict: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Nie podano opisu zmian
Nie podano opisu zmian
Linia 28:
 
{{Uwaga|
Zawsze przypisuj wartość początkową wszystkim zmiennym obiektu w jego metodzie <tt>__init__init__</tt>. Oszczędzi to godzin debugowania w poszukiwaniu wyjątków <tt>AtributeError</tt> powodowanych przez odwołania do niezainicjalizowanych (czyli nieistniejących) atrybutów.}}
 
'''Przykład 5.10. Standartowe metody klasy <tt>UserDict</tt>'''
Linia 42:
def values(self): return self.data.values()
 
# <tt>clear</tt> jest normalną metodą klasy; jest dostępna publicznie i może być wołana przez kogokolwiek w dowolnej chwili. Zauważ, że <tt>clear</tt>, jak wszystkie metody klas, ma <tt>self</tt> jako pierwszy argument. (Pamiętaj, że nie dodajesz <tt>self</tt> gdy wywołujesz metodę; Python robi to za Ciebie.) Zauważ podstawową cechę tej opakowującej klasy: przechowuje prawdziwy słownik (<tt>data</tt>) jako atrybut danych i definiuje wszystkie metody, które ma prawdziwy słownik, a w każdej z tych metod zwraca wynik identyczny do odpowiedniej metody słownika. (Gdybyś zapomniał, metoda <tt>clear</tt> słownika kasuje jego szystkiewszystkie klucze i wartości.)
# metoda <tt>copy</tt> słownika zwraca nowy słownik, będący dokładną kopią oryginału (mający takie same pary klucz-wartość). Ale klasa <tt>UserDict</tt> nie może po prostu wywołać <tt>self.data.copy</tt>, ponieważ ta metoda zwraca słownik a to co chcemy tu zrobić, to zwrócenie nowej instancji klasy takiej, jak <tt>self</tt>.
# Używamy atrybutu <tt>class</tt>, żeby sprawdzić, czy <tt>self</tt> jest obiektem klasy <tt>UserDict</tt>; jeśli tak, jesteś w domu, bo wiesz jak zrobić kopię <tt>UserDict</tt>: stwórz nowy obiekt <tt>UserDict</tt> i przekaż mu słownik wyciągnięty z <tt>self.data</tt>. Wtedy możesz od razu zwrócić nowy obiekt <tt>UserDict</tt> nie wykonując nawet instrukcji <tt>import</tt> z następnej linii.
Linia 52:
}}
 
W Pythonie możemy dziedziczyć bezpośrednio wbudowane typy danych, co pokazano wponiższymw poniższym przykładzie. Tutaj mamy trzy różnicyróżnice w porównaniu z wersją korzystającą z klasy <tt>UserDict</tt>.
 
'''Przykład 5.11. Dziedziczenie bezpośrednio z wbudowanej klasy <tt>dict</tt>'''