Zaawansowany kurs jezyka Python
Transkrypt
Zaawansowany kurs jezyka Python
Zaawansowany kurs języka Python Wykład 2. Marcin Młotkowski 6 października 2011 Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Plan wykładu 1 Klasy i obiekty 2 Zmienne w programowaniu obiektowym 3 Wyjątki 4 Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Deklaracja klasy Przykłady class Figura: ”””Pierwsza klasa””” def init (self, x, y): self.x = x self.y = y Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Definicja metody class Figura, cd. definicji ... def info(self): print(self.x, self.y) def zmien(self, x, y): self.x = x self.y = y Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Tworzenie obiektów i wywołanie metod Przykład o = Figura(1, -1) o.info() o.zmien(2,3) o.info() Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Dziedziczenie class Okrag(Figura): ”””Okrag””” def init (self): self.x, self.y, self.r = 0, 0, 1 def info(self): print(’x = %i, y = %i, r = %i’ % (self.x, self.y, self.r)) Wywołanie konstruktora z nadklasy def init (self): Figura. init (self) ... Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Metody wirtualne Class Figura def info(self): ... def przesun(self, dx, dy): self.info() self.x, self.y = self.x + dx, self.y + dy self.info() Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Metody wirtualne Class Figura def info(self): ... def przesun(self, dx, dy): self.info() self.x, self.y = self.x + dx, self.y + dy self.info() okrag = Okrag(); okrag.przesun(10,15) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Wielodziedziczenie class Samochod: def naprzod(self): class Okret: def naprzod(self): class Amfibia(Samochod, Okret): Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Wielodziedziczenie class Samochod: def naprzod(self): class Okret: def naprzod(self): class Amfibia(Samochod, Okret): Zagadka amf = Amfibia() amf.naprzod() Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Rozwiązywanie konfliktów Pojazd + naprzod() Okret Samochod + naprzod() Amfibia Reguła W głąb, od lewej do prawej Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Plan wykładu 1 Klasy i obiekty 2 Zmienne w programowaniu obiektowym 3 Wyjątki 4 Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Pola statyczne klasy class Okrag: pi = 3.1415 def __init__(self): self.r = 2.71 def pole(self): print( ”Pole okręgu = %i” % (Okrag.pi * self.r **2 )) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Pola statyczne klasy class Okrag: pi = 3.1415 def __init__(self): self.r = 2.71 def pole(self): print( ”Pole okręgu = %i” % (Okrag.pi * self.r **2 )) Odwołanie do pól statycznych klasy print(Okrag.pi) o = Okrag() print(o.pi) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Pola obiektu class Okrag: pi = 3.1415 self.x, self.y = 0, 0 def __init__(self): self.x, self.y = 0, 0 Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zmienne Fakt 1. Zmienne można dodawać dynamicznie Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zmienne Fakt 1. Zmienne można dodawać dynamicznie Nowa zmienna modułu modul.nowa zmienna = ’Nowa zmienna’ Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zmienne Fakt 1. Zmienne można dodawać dynamicznie Nowa zmienna modułu modul.nowa zmienna = ’Nowa zmienna’ Nowa zmienna obiektu o = Figura() o.nowe pole = ”Nowe pole” Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zmienne Fakt 2. Zmienne można usuwać dynamicznie Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zmienne Fakt 2. Zmienne można usuwać dynamicznie Przykład x = ’x’ del x Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zmienne prywatne Zmienną prywatną jest zmienna poprzedzona dwoma podkreśleniami i zakończona co najwyżej jednym podkreśleniem (dotyczy modułów i klas). Np. __zmiennaPrywatna Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Plan wykładu 1 Klasy i obiekty 2 Zmienne w programowaniu obiektowym 3 Wyjątki 4 Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Wyjątki Mechanizm przepływu sterowania Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Wyjątki Mechanizm przepływu sterowania Wyjątki to obiekty Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obsługa wyjątków try: f = open(”plik”[10] + ”.py”, ”r”) except IOError: print(”Błąd wejścia/wyjścia”) except IndexError as x: print(x) except: print(”Nieznany wyjątek”) finally: f.close() # Dopiero od 2.5! Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obsługa wyjątków try: f = open(”plik”[10] + ”.py”, ”r”) except IOError: print(”Błąd wejścia/wyjścia”) except IndexError, x: print(x) except: print(”Nieznany wyjątek”) finally: f.close() # Dopiero od 2.5! Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Klauzula else try: print 2/n except: print(”Nieudane dzielenie”) else: print(”Udane dzielenie”) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zgłaszanie wyjątków raise raise RuntimeError(”Stało się coś złego”) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Zgłaszanie wyjątków raise raise RuntimeError(”Stało się coś złego”) raise ”Wyjątek” Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Plan wykładu 1 Klasy i obiekty 2 Zmienne w programowaniu obiektowym 3 Wyjątki 4 Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Wszystko jest obiektem. Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Stary i nowy styl Klasyczne klasy Rozróżnienie między typami wbudowanymi i użytkownika Klasy w nowym stylu Brak rozróżnienia między klasami a typami Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Klasy i nadklasy obiektów Jak sprawdzić klasę obiektu >>> type(5) <type ’int’> >>> x = 5 >>> x. class <type ’int’> Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Klasy i nadklasy obiektów Jak sprawdzić klasę obiektu >>> type(5) <type ’int’> >>> x = 5 >>> x. class <type ’int’> Jak sprawdzić nadklasę obiektu <type ’int’> >>> x = 5 >>> x. class . bases (<type ’object’>, ) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Uniwersalny obiekt Obiekt uniwersalny: ma wszystkie pola i implementuje dowolną metodę. Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Implementacja uniwersalnego obiektu Implementacja klasy class Uniwersalna(object): Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Implementacja uniwersalnego obiektu Implementacja klasy class Uniwersalna(object): Implementacja dostępu do atrybutów def getattr (self, name): print (”Odwołujesz się do atrybutu”, name) return self def setattr (self, name, val): print (”Przypisanie %s wartości %s)” % (name, val)) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Implementacja uniwersalnego obiektu Implementacja klasy class Uniwersalna(object): Implementacja dostępu do atrybutów def getattr (self, name): print (”Odwołujesz się do atrybutu”, name) return self def setattr (self, name, val): print (”Przypisanie %s wartości %s)” % (name, val)) Wszystkie metody def call (self, *args): print ”Wywołano metodę z argumentami”, args Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Zadanie Implementacja klasy wektorów Vector: operatory arytmetyczne v1 = Vector([1, 0, 0]) v1 = Vector([0, 1, 0]) v3 = v1 + v2 str(Vector([0, 0 1])): <0, 0, 1> len(Vector([0, 0 1])): 3 Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Implementacja wektorów class Vector: def init (self, lista): self.value = lista Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Implementacja wektorów class Vector: def init (self, lista): self.value = lista Implementacja dodawania def add (self, arg): if self. class <> arg. class or len(self.value) <> len(arg.value): return None res = Vector( [x + y for x, y in zip(self.value, arg.value) ]) return res Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Wykorzystanie v1 = Vector([1, 0, 3]) v2 = Vector([0, 2, 0]) print v1 + v2 Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Inne standardowe metody mul — mnożenie sub — odejmowanie div — dzielenie mod — reszta z dzielenia Tak zdefiniowane operatory zachowują standardowe priorytety. Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Postać napisowa >>> print Vector([1,2,3]) < main .Vector instance at 0xb7eabdec> Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Postać napisowa >>> print Vector([1,2,3]) < main .Vector instance at 0xb7eabdec> class Vector def str (self): return ’<’ + ’, ’.join([str(x) for x in self.value]) + ’>’ Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Postać napisowa >>> print Vector([1,2,3]) < main .Vector instance at 0xb7eabdec> class Vector def str (self): return ’<’ + ’, ’.join([str(x) for x in self.value]) + ’>’ >>> print Vector([1,2,3]) <1, 2, 3> Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Własności kolekcji Pożądane cechy kolekcji Indeksowany dostęp do danych k[4] Obsługa poprzez iteratory for–in rozmiar kolekcji len Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Dostęp indeksowany Implementacja akcesorów w klasie Vector def getitem (self, index): return self.value[index] def setitem (self, index, value): self.value[index] = value Zastosowanie >>> print v1[k] >>> v1[k] = k Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Pozostałe własności kolekcji Usuwanie elementu za pomoca del def delitem (self, index): del self.value[index] Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Pozostałe własności kolekcji Usuwanie elementu za pomoca del def delitem (self, index): del self.value[index] Długość kolekcji: len def len (self): return len(self.value) Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Stan obiektu/modułu ’Napis’. class Figura. doc Figura. dict plik. file name Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Słowniki symboli Zmienne (oraz nazwy funkcji) w czasie działania programu są przechowywane w słowniku. dir() dict Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Funkcja standardowa dir() Co robi dir Zwraca listę dostępnych nazw. Jeśli nie podano argumentu, to podaje listę symboli w lokalnym słowniku. Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Funkcja standardowa dir() Co robi dir Zwraca listę dostępnych nazw. Jeśli nie podano argumentu, to podaje listę symboli w lokalnym słowniku. >>> dir(Vector([1,2,3])) [’ add ’, ’ cmp ’, ’ delitem ’, ’ doc ’, ’ getitem ’, ’ init ’, ’ len ’, ’ module ’, ’ setitem ’, ’ str ’, ’iter’, ’next’, ’value’] >>> Vector([1,2]). dict {’value’: [1, 2, 3]} Marcin Młotkowski Zaawansowany kurs języka Python Klasy i obiekty Zmienne w programowaniu obiektowym Wyjątki Model obiektowy Obiekty w Pythonie Specjalne atrybuty obiektów Obiekty jako kolekcje Badanie stanu obiektu — refleksje Przydatność słowników if ’nazwa’ in obj. dict : print obj.nazwa if ” str ” in dir(obj): print dir(obj) Marcin Młotkowski Zaawansowany kurs języka Python