{"id":319,"date":"2020-04-15T11:51:31","date_gmt":"2020-04-15T10:51:31","guid":{"rendered":"https:\/\/stachura-terlecka.pl\/?page_id=319"},"modified":"2020-04-15T11:51:31","modified_gmt":"2020-04-15T10:51:31","slug":"programowanie-obiektowe-cz-1","status":"publish","type":"page","link":"https:\/\/stachura-terlecka.pl\/?page_id=319","title":{"rendered":"Programowanie obiektowe cz 1"},"content":{"rendered":"<h2> Programowanie obiektowe cz 1<\/h2>\n<h2><\/h2>\n<h3> Do przygotowania przed zaj\u0119ciami<\/h3>\n<p>* Python dla ka\u017cdego. Podstawy programowania. &#8211; Michael Dawson &#8211; Helion **R** &#8211; Rozdzia\u0142 8. Wprowadzenie. Koniec gry.<\/p>\n<h3> Cel i tematyka zaj\u0119\u0107<\/h3>\n<p>Dzisiejsze laboratorium ma na celu zapoznanie Pa\u0144stwa z nast\u0119puj\u0105cymi zagadnieniami:<br \/>\n* podstawy programowania obiektowego,<br \/>\n* klasy,<br \/>\n* metody,<br \/>\n* obiekty.<\/p>\n<h5> &#8211; Zadanie przypominaj\u0105ce<\/h5>\n<p>* Zapisz do pliku list\u0119 zawieraj\u0105c\u0105 imiona polskie 10 sztuk (np. Katarzyna, Marzena, Wies\u0142aw, Olgierd, Szymon, Joanna, Barbara, \u0141ukasz, Krzysztof, Piotr) plik nazwij imiona.dat, w drugim pliku o nazwie nazwiska.dat pobierz od u\u017cytkownika do listy 10 nazwisk i zapisz do pliku nazwiska.dat nast\u0119pnie pobierz dane z pliku imiona.dat do listy imiona2 oraz pobierz dane z pliku nazwiska.dat do listy nazwiska2. Wykonaj losowanie elementu (pami\u0119taj, \u017ce indeksy w li\u015bcie zaczynaj\u0105 si\u0119 od 0) z listy imiona i z listy nazwiska i wy\u015bwietl wylosowane dane u\u017cytkownikowi. PODPOWIED\u0179: pobieranie informacji od u\u017cytkownika do listy by\u0142o realizowane na laboratorium 4, za\u015b &#8220;konserwowanie list&#8221; przerabiali\u015bmy na ostatnich zaj\u0119ciach.<\/p>\n<h3> Programowanie obiektowe<\/h3>\n<p>Programowanie obiektowe cho\u0107 uwa\u017cane za skomplikowane to jedno z najcz\u0119\u015bciej i najch\u0119tniej u\u017cywanych metod programowania.<\/p>\n<h6> Definiowanie klas<\/h6>\n<p>Klasy tak najog\u00f3lniej m\u00f3wi\u0105c s\u0105 pewnego rodzaju wzorcami na podstawie kt\u00f3rych mo\u017cemy tworzy\u0107 obiekty. Klasa inaczej m\u00f3wi\u0105c jest definicj\u0105 obiektu.<br \/>\nPoni\u017cej widzicie Pa\u0144stwo definicj\u0119 klasy &#8211; przyk\u0142adowa klasa ma nazw\u0119 Critter &#8211; prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, \u017ce zosta\u0142a ona napisana z du\u017cej litery. W tym przypadku jak i w sytuacji sta\u0142ych Python nie wymaga tego od programisty, ale jest to dobrym zwyczajem.<br \/>\n<code python=\"\"><br \/>\n# demonstracja definiowania klasy<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n'''Wirtualny pupil'''<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\"><\/code><\/p>\n<h6> Definiowanie metody<\/h6>\n<p>Definiowanie metody bardzo przypomina definiowanie funkcji i na pocz\u0105tku mo\u017cna my\u015ble\u0107, \u017ce metoda jest funkcj\u0105 zwi\u0105zan\u0105 z obiektem. Definiowanie metod wygl\u0105da nast\u0119puj\u0105co:<br \/>\n<code python=\"\"><br \/>\n# demonstracja definiowania metody<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n'''Wirtualny pupil'''<br \/>\ndef talk(self):<br \/>\nprint(\"Cze\u015b\u0107! Jestem egzemplarzem klasy Critter.\")<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\"><\/code><br \/>\n**UWAGA**  Je\u015bli tworz\u0105c metod\u0119 nie dodasz \u017cadnych parametr\u00f3w wygenerujesz b\u0142\u0105d przy jej wywo\u0142aniu (w funkcji mogli\u015bmy tworzy\u0107 je bez parametr\u00f3w za\u015b w przypadku metod nie ma takiej mo\u017cliwo\u015bci). Metoda **MUSI** zawiera\u0107 specjalny pierwszy parametr jakim jest self.<\/p>\n<h6> Konkretyzacja obiektu<\/h6>\n<p>Obiekt jest odwzorowaniem fizycznie istniej\u0105cych element\u00f3w opisanych przez sw\u00f3j wzorzec czyli klas\u0119. Mo\u017cemy stworzy\u0107 wiele obiekt\u00f3w o r\u00f3\u017cnych nazwach wykorzystuj\u0105cych ten sam wzorzec. Wyobra\u017amy sobie projekt domu (niech b\u0119dzie on nasz\u0105 klas\u0105) na jego podstawie mo\u017cemy wybudowa\u0107 wiele dom\u00f3w r\u00f3\u017cni\u0105cych si\u0119 atrybutami np. kolorem elewacji, uk\u0142adem mebli, kolorem \u015bcian w pomieszczeniu jednak zawsze b\u0119d\u0105 to budynki oparte o ten sam projekt. Obiekty przypisujemy do zmiennej:<br \/>\n<code python=\"\"><br \/>\n# demonstracja konkretyzacji obiektu<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n'''Wirtualny pupil'''<br \/>\ndef talk(self):<br \/>\nprint(\"Cze\u015b\u0107! Jestem egzemplarzem klasy Critter.\")<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\">#main<br \/>\ncat = Critter()<br \/>\ndog = Critter()<br \/>\n<\/code><\/p>\n<h6> Wywo\u0142anie metody<\/h6>\n<p>Ka\u017cdy ze skonkretyzowanych wcze\u015bniej obiekt\u00f3w posiada metod\u0119 \/\/talk()\/\/.  Mo\u017cemy j\u0105 wywo\u0142a\u0107 w nast\u0119puj\u0105cy spos\u00f3b<br \/>\n<code python=\"\"><br \/>\n# demonstracja konkretyzacji obiektu<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n'''Wirtualny pupil'''<br \/>\ndef talk(self):<br \/>\nprint(\"Cze\u015b\u0107! Jestem egzemplarzem klasy Critter.\")<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\">#main<br \/>\ncat = Critter()<br \/>\ndog = Critter()<br \/>\ncat.talk()<br \/>\ndog.talk()<br \/>\n<\/code><\/p>\n<h6> U\u017cywanie konstruktor\u00f3w<\/h6>\n<p>Umiemy ju\u017c tworzy\u0107 metody takie jak talk(). Mo\u017cemy zatem napisa\u0107 specjaln\u0105 metod\u0119 zwan\u0105 **konstruktorem** metoda taka wywo\u0142ywana jest zawsze w momencie gdy tworzymy nowy obiekt. Konstruktory u\u017cywane s\u0105 zazwyczaj do nadawania warto\u015bci pocz\u0105tkowych atrybutom obiektu. Konstruktor nazywany jest init. **Wszystkie** metody specjalne jak przytoczony tutaj konstruktor rozpoczynaj\u0105 si\u0119 i ko\u0144cz\u0105 na dw\u00f3ch -podkre\u015bleniach.<br \/>\n<code python=\"\"><br \/>\n# demonstracja zastosowania konstruktora<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n'''Wirtualny pupil'''<br \/>\ndef __init__(self):<br \/>\nprint(\"Urodzi\u0142 si\u0119 nowy zwierzak!\")<br \/>\ndef talk(self):<br \/>\nprint(\"Cze\u015b\u0107! Jestem egzemplarzem klasy Critter.\")<\/code><\/p>\n<p><code python=\"\"><br \/>\n<\/code><code python=\"\"><\/code><code python=\"\">#main<br \/>\ncat = Critter()<br \/>\ndog = Critter()<br \/>\ncat.talk()<br \/>\ndog.talk()<br \/>\n<\/code><\/p>\n<h6> Korzystanie z atrybut\u00f3w<\/h6>\n<p>Poni\u017cej przedstawiony kod tworzy obiekt z atrybutem name. Tak jak w przyk\u0142adzie przytoczonym na pocz\u0105tku \u0107wicze\u0144 gdzie ka\u017cdy budynek mial inny kolor. Tak w przypadku naszego programu ka\u017cdy obiekt klasy \/\/Critter()\/\/ b\u0119dzie mia\u0142 inne imi\u0119.<br \/>\n<code python=\"\"><br \/>\n#demonstracja wykorzystania atrybut\u00f3w<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n'''Wirtualny pupil'''<br \/>\ndef __init__(self, name):<br \/>\nprint(\"Urodzi\u0142 si\u0119 nowy zwierzak!\")<br \/>\nself.name = name<br \/>\ndef __str__(self):<br \/>\nrep = \"Obiekt klasy Critter\\n\"<br \/>\nrep += \"name: \" + self.name + \"\\n\"<br \/>\nreturn rep<br \/>\ndef talk(self):<br \/>\nprint(\"Cze\u015b\u0107! Jestem\",self.name,\"\\n\")<\/code><\/p>\n<p><code python=\"\">#main<br \/>\ncat = Critter(\"Bonifacy\")<br \/>\ncat.talk()<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\">dog = Critter(\"Reksio\")<br \/>\ndog.talk()<br \/>\n<\/code><\/p>\n<h5> Inicjalizacja atrybut\u00f3w<\/h5>\n<p>Aby korzysta\u0107 z atrybut\u00f3w &#8211; musimy je zainicjalizowa\u0107 w konstruktorze klasy. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119 na konstruktor przedstawiony poni\u017cej:<br \/>\n<code python=\"\"><br \/>\nclass Critter(object):<br \/>\n'''Wirtualny pupil'''<br \/>\ndef __init__(self, name):<br \/>\nprint(\"Urodzi\u0142 si\u0119 nowy zwierzak!\")<br \/>\nself.name = name<br \/>\n<\/code><br \/>\nPierwsza linijka konstruktora wy\u015bwietla komunikat o urodzeniu si\u0119 nowego zwierzaka i ten fragment jest nam ju\u017c znany z poprzednich program\u00f3w, za\u015b w drugiej linijce pojawi\u0142a si\u0119 nowa konstrukcja self.name &#8211; jednak aby j\u0105 dobrze zrozumie\u0107 nale\u017cy wiedzie\u0107 czym jest self. Ten tajemniczy parametr jest pierwszym parametrem ka\u017cdej metody, kt\u00f3ry jako swoj\u0105 warto\u015b\u0107 otrzymuje referencj\u0119 do obiektu kt\u00f3ry wywo\u0142a\u0142 metod\u0119. Dzi\u0119ki temu parametrowi metoda mo\u017ce si\u0119ga\u0107 do atrybut\u00f3w obiektu kt\u00f3ry j\u0105 wywo\u0142a\u0142. Czyli w naszym przyk\u0142adzie metoda \/\/talk()\/\/ mo\u017ce wypisa\u0107 imi\u0119 zwierzaka.<\/p>\n<h6> Korzystanie z atrybut\u00f3w<\/h6>\n<p>Je\u017celi chcemy uzyska\u0107 dost\u0119p do atrybutu obiektu wykonujemy to za pomoc\u0105 podania nazwy w naszych przyk\u0142adach to np. cat lub dog robimy to nast\u0119puj\u0105co:<br \/>\n<code python=\"\"><br \/>\nprint(cat.name)<br \/>\nprint(dog.name)<br \/>\n<\/code><br \/>\nTaki spos\u00f3b dost\u0119pu do atrybutu jest nazywany dost\u0119pem bezpo\u015brednim.<\/p>\n<h5> Metody i atrybuty zwi\u0105zane z klas\u0105<\/h5>\n<p>Python umo\u017cliwia programi\u015bcie tworzenie metod statycznych zwi\u0105zanych z klas\u0105 a nie obiektem, tak samo jest w przypadku atrybut\u00f3w &#8211; takie elementy znacz\u0105co u\u0142atwiaj\u0105 \u017cycie programistom. Wyobra\u017amy sobie sytuacj\u0119: chcemy wiedzie\u0107 ile stworzyli\u015bmy ju\u017c zwierz\u0105t na podstawie klasy Critter &#8211; mo\u017cemy utworzy\u0107 atrybut total &#8212; jednak je\u015bli to b\u0119dzie atrybut obiektu bardzo uci\u0105\u017cliwym b\u0119dzie aktualizowanie go we wszystkich stworzonych obiektach klasy Critter, w takim celu u\u017cywamy atrybutu klasy. Tworzymy j\u0105 nast\u0119puj\u0105co:<\/p>\n<p><code python=\"\"><br \/>\n# Zwierzak z klas\u0105<br \/>\n# Demonstruje atrybuty klasy i metody statyczne<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n\"\"\"Wirtualny pupil\"\"\"<br \/>\ntotal = 0<\/code><\/p>\n<p><code python=\"\">@staticmethod<br \/>\ndef status():<br \/>\nprint(\"\\nOg\u00f3lna liczba zwierzak\u00f3w wynosi\", Critter.total)<\/p>\n<p>def __init__(self, name):<br \/>\nprint(\"Urodzi\u0142 si\u0119 zwierzak!\")<br \/>\nself.name = name<br \/>\nCritter.total += 1<\/p>\n<p>#cz\u0119\u015b\u0107 g\u0142\u00f3wna<br \/>\nprint(\"Uzyskanie dost\u0119pu do atrybutu klasy Critter.total:\", end=\" \")<br \/>\nprint(Critter.total)<\/p>\n<p>print(\"\\nTworzenie zwierzak\u00f3w.\")<br \/>\ncrit1 = Critter(\"zwierzak 1\")<br \/>\ncrit2 = Critter(\"zwierzak 2\")<br \/>\ncrit3 = Critter(\"zwierzak 3\")<\/p>\n<p>Critter.status()<\/p>\n<p>print(\"\\nUzyskanie dost\u0119pu do atrybutu klasy poprzez obiekt:\", end= \" \")<br \/>\nprint(crit1.total)<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\"><\/code><\/p>\n<h5> Zadania do samodzielnego wykonania na laboratoriach<\/h5>\n<p>* przeanalizuj kod i om\u00f3w go na zaj\u0119ciach:<br \/>\n<code python=\"\"><br \/>\n# Prosty zwierzak<br \/>\n# Demonstruje podstawow\u0105 klas\u0119 i obiekt<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n\"\"\"Wirtualny pupil\"\"\"<br \/>\ndef talk(self):<br \/>\nprint(\"Cze\u015b\u0107!  Jestem egzemplarzem klasy Critter.\")<\/p>\n<p># cz\u0119\u015b\u0107 g\u0142\u00f3wna<br \/>\ncrit = Critter()<br \/>\ncrit.talk()<\/p>\n<p>input(\"\\n\\nAby zako\u0144czy\u0107 program, naci\u015bnij klawisz Enter.\")<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\"><\/code><br \/>\n* Stw\u00f3rz w\u0142asn\u0105 klas\u0119, kt\u00f3ra opisuje przeciwnik\u00f3w dla gracza. Utw\u00f3rz na jej podstawie 3 przeciwnik\u00f3w. Atrybuty to: punkty \u017cycia, si\u0142a, zr\u0119czno\u015b\u0107, obrona, atak, obra\u017cenia. Metody jakie powinna zawiera\u0107 klasa to: atak, obrona.<br \/>\n* Utw\u00f3rz konstruktor stworzonej wy\u017cej klasy, kt\u00f3ry b\u0119dzie informowa\u0142 o stworzeniu nowego przeciwnika.<\/p>\n<h5> &#8211; Przyk\u0142ady u\u017cywane na laboratoriach<\/h5>\n<p>Przyk\u0142ady pochodz\u0105 z ksi\u0105\u017cki<br \/>\n* Podstawow\u0105 ksi\u0105\u017ck\u0105 wykorzystywan\u0105 na laboratorium b\u0119dzie: \u201ePython dla ka\u017cdego. Podstawy programowania Wydanie III\u201d, autor Michael Dawson, Wydawnictwo Helion **(R)**<\/p>\n<h3> Zadanie domowe<\/h3>\n<p>**Wszystkie zadania domowe nale\u017cy archiwizowa\u0107 poniewa\u017c w dalszej cz\u0119\u015bci laboratori\u00f3w b\u0119dziecie je Pa\u0144stwo rozbudowywa\u0107**<br \/>\n* Stw\u00f3rz klas\u0119 postaci gracza. Atrybuty jakie powinna zawiera\u0107 klasa to: imi\u0119, rasa, punkty \u017cycia, obrona, si\u0142a, zr\u0119czno\u015b\u0107, budowa, inteligencja. Metody jakie powinna zawiera\u0107 klasa to: dob\u0105d\u017a bro\u0144  wywo\u0142anie tej\u017ce ma wy\u015bwietli\u0107 napis: Doby\u0142e\u015b bro\u0144.<br \/>\n* Stw\u00f3rz konstruktor klasy informuj\u0105cy o stworzeniu postaci.<br \/>\n* Python dla ka\u017cdego. Podstawy programowania. &#8211; Michael Dawson &#8211; Helion **R** &#8211; Rozdzia\u0142 9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programowanie obiektowe cz 1 Do przygotowania przed zaj\u0119ciami * Python dla ka\u017cdego. Podstawy programowania. &#8211; Michael Dawson &#8211; Helion **R** &#8211; Rozdzia\u0142 8. Wprowadzenie. Koniec gry. Cel i tematyka zaj\u0119\u0107 Dzisiejsze laboratorium ma na celu zapoznanie Pa\u0144stwa z nast\u0119puj\u0105cymi zagadnieniami: * podstawy programowania obiektowego, * klasy, * metody, * obiekty. &#8211; Zadanie przypominaj\u0105ce * Zapisz [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/319"}],"collection":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=319"}],"version-history":[{"count":3,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/319\/revisions"}],"predecessor-version":[{"id":2224,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/319\/revisions\/2224"}],"wp:attachment":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}