Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Podobne dokumenty
Zaawansowany kurs języka Python

Programowanie obiektowe

Kurs rozszerzony języka Python

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

Programowanie i projektowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe

TEMAT : KLASY DZIEDZICZENIE

Wykład 5: Klasy cz. 3

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Aplikacje w środowisku Java

Dziedziczenie. Zadanie 1


Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe

Podstawy Programowania Obiektowego

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Programowanie i projektowanie obiektowe

Technologie i usługi internetowe cz. 2

Programowanie obiektowe

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy Języka Java

Materiały do laboratorium MS ACCESS BASIC

Blockly Kodowanie pomoc.

7. Pętle for. Przykłady

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

PHP 5 język obiektowy

Podstawy programowania III

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

.NET Klasy, obiekty. ciąg dalszy

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Warsztaty dla nauczycieli

Listy, krotki, słowniki, funkcje

KOTLIN. Język programowania dla Androida

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe - 1.

Programowanie obiektowe

Algorytmy i Struktury Danych. Anna Paszyńska

Dziedziczenie. dr Jarosław Skaruz

Python wstęp. Michał Bereta

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

PARADYGMATY PROGRAMOWANIA Wykład 4

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Języki i techniki programowania Ćwiczenia 4 Wzorce

Programowanie i projektowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

10. Programowanie obiektowe w PHP5

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Wykład 4: Klasy i Metody

Technologie cyfrowe semestr letni 2018/2019

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Wykład 8: klasy cz. 4

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Python. Wprowadzenie. Jolanta Bachan

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Kurs WWW. Paweł Rajba.

Definiowanie własnych klas

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Programowanie 2. Język C++. Wykład 3.

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Wykład 5 Okna MDI i SDI, dziedziczenie

Mechanizm dziedziczenia

Lab 9 Podstawy Programowania

Podstawy programowania w Pythonie

Dokumentacja do API Javy.

Język Java część 2 (przykładowa aplikacja)

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Język Java część 2 (przykładowa aplikacja)

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie obiektowe - zadania

lekcja 8a Gry komputerowe MasterMind

Wstęp do programowania

Zaawansowany kurs języka Python

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Transkrypt:

Wizualizacja danych Ćwiczenie 5 Python 3: Programowanie obiektowe i dziedziczenie Dziedziczenie Mając klasę bazową możemy utworzyć klasę pochodną, która będzie dziedziczyć po klasie bazowej czyli będzie miała dostęp do atrybutów i metod z klasy bazowej i może mieć nowe metody i atrybuty w swojej definicji Przykład 1 class Ksztalty: #definicja konstruktora def init (self, x, y): #deklarujemy atrybuty #self wskazuje że chodzi o zmienne właśnie definiowanej klasy self.x=x self.y=y self.opis = "To będzie klasa dla ogólnych kształtów" def pole_prostokatu(self): return self.x * self.y def obwod(self): return 2 * self.x + 2 * self.y def dodaj_opis(self, text): self.opis = text def skalowanie(self, czynnik): self.x = self.x * czynnik self.x = self.y * czynnik #a teraz klasa która dziedziczy po klasie Ksztalty class Kwadrat(Ksztalty): def init (self, x): self.x =x self.y=x #i jeszcze klasa, która dziedziczy po klasie Kwadrat #bedzie definiwoać figurę złożoną z 3 kwadratów w kształcie litery L # _ # _ # class KwadratowaLiteraL(Kwadrat): def obwod(self): return 8 * self.x def pole_prostokatu(self): return 3 * self.x * self.y

print("inicjujemy klasę Kwadrat") figura = Kwadrat(5) #sprawdzamy metody z klasy bazowej print(figura.pole_prostokatu()) print(figura.obwod()) figura.dodaj_opis("kwadrat") print(figura.opis) figura.skalowanie(0.3) print(figura.obwod()) print("inicjujemy klasę KwadratowaLiteraL") litera_l = KwadratowaLiteraL(5) #sprawdzamy jakie możemy wywołać metody print(litera_l.obwod()) print(litera_l.pole_prostokatu()) litera_l.dodaj_opis("litera L") print(litera_l.opis) litera_l.skalowanie(0.5) print(litera_l.obwod()) Widać, że niektóre metody deklarujemy ponownie w potomnej klasie i to te nowe metody będą wywołane. To oznacza, że metody o tych samych nazwach w klasach potomnych zostały przesłonięte. Zad. 1 Stwórz 3 klasy: Materiał, Ubrania, Swetry. Klasa: Materiał Atrybuty: rodzaj, długość szerokość Metody: konstruktor wyświetl_nazwę Klasa: Ubrania Atrybuty: rozmiar kolor dla_kogo

Metody: wyświetl_dane do wyświetlania informacji o ubraniu klasa: Sweter Atrybuty: rodzaj_swetra np. Rozpinany, z golfem itd. Metody: wyświetl_dane Ubrania dziedziczą po klasie Materiał, a Swetry po klasie Ubrania. Stwórz kilka instancji obiektów i sprawdź, które metody można wykorzystać. Przesłanianie metod i atrybutów Przykład przesłaniania metody został przedstawiony w przykładzie 1, ale warto dodać, że możemy również przesłaniać metody i zmienne dziedziczone po superklasie bazowej object, czyli tej, po której dziedziczy każdy obiekt w Pythonie. Możemy np. przeciążyć metodę str (), która zwraca tekstową reprezentację obiektu i domyślnie wyświetla informację o typie obiektu oraz adresie zajmowanym w pamięci komputera. class Kwadrat(Ksztalty): def init (self, x): self.x =x self.y=x Zad.2 def str (self): return Kwadrat o boku {}.format(self.x) Przeciąż metodę add () dla klasy Kwadrat, która będzie zwracała instancje klasy Kwadrat o nowym boku, będącym sumą boków dodawanych do siebie kwadratów. Zad 3. Poczytaj o metodach ge, gt, le, lt, przeciąż je i spróbuj wykorzystać w instrukcji warunkowej do porównania dwóch instancji obiektów klasy Kwadrat.

Atrybuty globalne, puste klasy oraz ponownie zmienna prywatna Nawiązując do wprowadzenia do programowania obiektowego w języku Python należy wspomnieć o możliwości stworzenia atrybutów współdzielonych przez wszystkie instancje danej klasy. class Point: counter = [] def init (self, x=0, y=0): """Konstuktor punktu.""" self.x = x self.y = y def update(self, n): self.counter.append(n) p1 = Point(0,0) p2 = Point(1,1) print(p1.counter) print(p2.counter) p1.update(1) print(p1.counter) print(p2.counter) Na wyjściu otrzymamy: [] [] [1] [1] Zad. 4 Korzystając z powyższego kodu stwórz kilka instancji klasy Point i spróbuj odwołać się do zmiennej counter z poziomu różnych instancji, porównując jej wartość dla każdej z nich oraz spróbuj zmienić jej wartość. Ciekawostką jest to, że możemy stworzyć pustą klasę tylko po to, żeby przechować wartość wielu zmiennych w pojedynczej referencji, coś jak struktura w języku C. class Pracownik: pass janek = Pracownik() janek.imie = "Janek"

janek.nazwisko = "Kowalski" janek.wiek = 30 Wracając do zmiennych prywatnych z zestawu 4 warto jeszcze wiedzieć o sposobie dostania się do tej zmiennej. class Pracownik: prywatna = "tajne hasło" def init (self, imie): self.imie = imie janek = Pracownik("Janek") print(janek. prywatna) # to nie zadziała print(janek._pracownik prywatna) # ale to już tak Iteratory oraz generatory Rozpatrując poniższy fragment kodu: for element in range(1, 11): print(element) wszystko raczej jest jasne. Ale skąd pętla for wie jak ma się uniwersalnie zachowywać dla każdego, ale jednak różnego, obiektu iterowalnego? Cały mechanizm jest obsługiwany przez iteratory. W niewidoczny dla nas sposób pętle for wywołuje funkcję iter() na obiekcie kolekcji. Funkcja zwraca obiekt iteratora, który ma zdefiniowaną metodę next (), odpowiedzialną za zwracanie kolejnych elementów kolekcji. Kiedy nie ma już więcej elementów kolekcji zgłaszany jest wyjątek StopIteration, kończący działanie pętli for. Można wywołać funkcję next () iteratora za pomocą wbudowanej funkcji next(). Przykład imie = "Reks" it = iter(imie) it <str_iterator object at 0x0000000003807FD0>

'R' 'e' 'k' 's' Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration Przykład implementacji własnego iteratora. class Wspak: """Iterator zwracający wartości w odwróconym porządku""" def init (self, data): self.data = data self.index = len(data) def iter (self): return self def next (self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index] Zad. 5 Przetestuj powyższy iterator na kilku różnych kolekcjach. Zad. 6 Napisz własny iterator, który będzie zwracał tylko elementy z parzystych indeksów przekazanej kolekcji. Zad.7 Napisz własny iterator, który będzie zwracał tylko samogłoski z przekazanego ciągu tekstowego. Zaimplementuj sprawdzanie czy przekazany został string jako argument konstruktora tego iteratora (sprawdź funkcję isinstance()). Generatory są prostymi narzędziami do tworzenia iteratorów. Generatory piszemy jak standardowe funkcje, ale zamiast instrukcji return używamy yield kiedy chcemy zwrócić wartość. Za każdym razem kiedy funkcja next() jest wywoływana na generatorze wznawia on swoje działanie w

momencie, w którym został przerwany. Poniżej przykład generatora, którego działanie jest podobne do iteratora zaprezentowanego w przykładzie. Przykład def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] gen = reverse("feliks") print(next(gen)) print("marek") print(next(gen)) Na wyjściu otrzymamy: s Marek k Podobny efekt możemy również osiągnąć poprzez wyrażenia generujące. Przykład # wyrażenia generujące litery = (litera for litera in "Zdzisław") print(litery) print(next(litery)) Na wyjściu: <generator object <genexpr> at 0x0000000003E96B48> Z Zad.8 Przepisz jeden z napisanych przez siebie iteratorów na generator. Zad. 9 Zaimportuj pakiet itertools i znajdź w jego dokumentacji sposób na wygenerowanie kombinacji 3 elementowych bez powtórzeń na zbiorze 10 elementowym.

Zad. 10 Napisz generator, który będzie zwracał kolejne wartości ciągu Fibonacciego. Zad. 11 Za pomocą wyrażenia generującego stwórz generator zwracający polskie nazwy miesięcy. Konstruktor klasy bazowej i dziedziczenie wielokrotne Poniższy przypadek pokazuje ponownie dziedziczenie jednokrotne po klasie bazowej, gdzie mamy 3 klasy: class Osoba: def init (self, imie, nazwisko): self.imie = imie self.nazwisko = nazwisko return "{} {}".format(self.imie, self.nazwisko) class Pracownik(Osoba): def init (self, imie, nazwisko, pensja): Osoba. init (self, imie, nazwisko) # lub # super(). init (imie, nazwisko) self.pensja = pensja return "{} {} i zarabiam {}".format(self.imie, self.nazwisko, self.pensja) class Menadzer(Pracownik): return "{} {}, jestem menadżerem i zarabiam {}".format(self.imie, self.nazwisko, self.pensja) jozek = Pracownik("Józek", "Bajka", 2000) adrian = Menadzer("Adrian", "Mikulski", 12000) print(jozek.przedstaw_sie()) print(adrian.przedstaw_sie())

Zwróć uwagę na konstruktor klasy Pracownik, który wywołuje konstruktor bazowej klasy Osoba. Natomiast w definicji klasy Manadzer konstruktora nie ma a mimo to jestem w stanie zainicjalizować obiekt tak jak obiekt Pracownik. Zad. 12 Za pomocą funkcji isinstance() oraz issubclass() sprawdź wynik dla instancji obiektu Pracownik oraz Menadzer dla klas Osoba, Pracownik i Manadzer. Zwróć uwagę na poniższy przykład dziedziczenia wielokrotnego i konstruktor. class Osoba: def init (self, imie, nazwisko): self.imie = imie self.nazwisko = nazwisko return "{} {}".format(self.imie, self.nazwisko) class Pracownik: def init (self, pensja): self.pensja = pensja return "{} {} i zarabiam {}".format(self.imie, self.nazwisko, self.pensja) class Menadzer(Osoba, Pracownik): def init (self, imie, nazwisko, pensja): Osoba. init (self, imie, nazwisko) Pracownik. init (self, pensja) return "{} {}, jestem menadżerem i zarabiam {}".format(self.imie, self.nazwisko, self.pensja) adrian = Menadzer("Adrian", "Mikulski", 12000) print(adrian.przedstaw_sie())