{"id":323,"date":"2020-04-15T12:17:50","date_gmt":"2020-04-15T11:17:50","guid":{"rendered":"https:\/\/stachura-terlecka.pl\/?page_id=323"},"modified":"2020-04-15T12:17:50","modified_gmt":"2020-04-15T11:17:50","slug":"programowanie-obiektowe-cz-2","status":"publish","type":"page","link":"https:\/\/stachura-terlecka.pl\/?page_id=323","title":{"rendered":"Programowanie obiektowe cz 2"},"content":{"rendered":"<h2> Programowanie obiektowe cz 2<\/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* atrybuty prywatne,<br \/>\n* metody prywatne,<br \/>\n* w\u0142a\u015bciwo\u015bci.<\/p>\n<h4> &#8211; Zadanie przypominaj\u0105ce<\/h4>\n<p>* Utw\u00f3rz program symuluj\u0105cy lokacje, tworz\u0105cy je jako obiekty. Wy\u015bwietl u\u017cytkownikowi opis swojej lokacji. Stw\u00f3rz 5 lokacji. U\u017cytkownik ma mie\u0107 mo\u017cliwo\u015b\u0107 wybrania lokalizacji po jej nazwie w celu wy\u015bwietlenia opisu.<\/p>\n<h3> Hermetyzacja obiekt\u00f3w<\/h3>\n<p>Z hermetyzacj\u0119 spotkali\u015bcie si\u0119 ju\u017c Pa\u0144stwo wcze\u015bniej przy funkcjach. Tak jak w przypadku funkcji gdzie g\u0142\u00f3wny program powinien komunikowa\u0107 si\u0119 za pomoc\u0105 parametr\u00f3w i warto\u015bci zwracanych, tak i w przypadku obiekt\u00f3w program (klient) nie powinien mie\u0107 dost\u0119pu i mo\u017cliwo\u015bci modyfikacji bezpo\u015bredniej atrybut\u00f3w.<\/p>\n<h5> Metody i atrybuty prywatne<\/h5>\n<p>Nazwy atrybut\u00f3w i metod prywatnych rozpoczynamy od podw\u00f3jnego podkre\u015blenia, ale w przeciwie\u0144stwie do metod specjalnych nie ko\u0144czymy ich za pomoc\u0105 podw\u00f3jnego podkre\u015blenia.<br \/>\n<code python=\"\"><br \/>\n# Prywatny zwierzak<br \/>\n# Demonstruje zmienne i metody prywatne<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n\"\"\"Wirtualny pupil\"\"\"<br \/>\ndef __init__(self, name, mood):<br \/>\nprint(\"Urodzi\u0142 si\u0119 nowy zwierzak!\")<br \/>\nself.name = name            # atrybut publiczny<br \/>\nself.__mood = mood          # atrybut prywatny<\/code><\/p>\n<p><code python=\"\">def talk(self):<br \/>\nprint(\"\\nJestem\", self.name)<br \/>\nprint(\"W tej chwili czuj\u0119 si\u0119\", self.__mood, \"\\n\")<\/p>\n<p>def __private_method(self):<br \/>\nprint(\"To jest metoda prywatna.\")<\/p>\n<p>def public_method(self):<br \/>\nprint(\"To jest metoda publiczna.\")<br \/>\nself.__private_method()<\/p>\n<p># mein<br \/>\ncrit = Critter(name = \"Reksio\", mood = \"szcz\u0119\u015bliwy\")<br \/>\ncrit.talk()<br \/>\ncrit.public_method()<\/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 \/>\nDost\u0119p do tych metod spoza klasy w naszym przypadku __Critter__ jest utrudniony. Python zwraca b\u0142\u0105d w sytuacji gdy chcemy odwo\u0142a\u0107 si\u0119 do atrybutu spoza klasy.<\/p>\n<h5> Dost\u0119p do atrybut\u00f3w prywatnych<\/h5>\n<p>Pomimo tego, \u017ce dost\u0119p do atrybut\u00f3w prywatnych jest utrudniony to nie jest on technicznie niemo\u017cliwy. Python ukrywa te atrybuty za specjaln\u0105 sekwencj\u0105 przedstawion\u0105 poni\u017cej.<br \/>\n<code python=\"\"><br \/>\nprint(crit._Critter__mood)<\/code><\/p>\n<p><code python=\"\"><br \/>\n<\/code><code python=\"\"><\/code><\/p>\n<h5> Dost\u0119p do metod prywatnych<\/h5>\n<h5>\nTak jak w przypadku atrybut\u00f3w tak i w przypadku metod prywatnych z za\u0142o\u017cenia powinny z nich korzysta\u0107 elementy wewn\u0105trz klasy. Dost\u0119p z zewn\u0105trz wygl\u0105da nast\u0119puj\u0105co<br \/>\n<code python=\"\"><br \/>\ncrit._Critter__private_method()<br \/>\n<\/code><\/h5>\n<h5> Kontrolowanie dost\u0119pu do atrybut\u00f3w<\/h5>\n<p>Atrybuty prywatne powinny by\u0107 u\u017cywane tylko wtedy gdy jest to naprawd\u0119 konieczne. Je\u015bli nie ma konieczno\u015bci u\u017cywania atrybutu prywatnego, a chcieliby\u015bmy ograniczy\u0107 np. mo\u017cliwo\u015b\u0107 modyfikacji wtedy z pomoc\u0105 przychodzi nam w\u0142a\u015bciwo\u015bci atrybut\u00f3w.<br \/>\n<code python=\"\"><br \/>\n# Zwierzak z w\u0142a\u015bciwo\u015bci\u0105<br \/>\n# Demonstruje w\u0142a\u015bciwo\u015bci<\/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<\/code><\/p>\n<p><code python=\"\">@property<br \/>\ndef name(self):<br \/>\nreturn self.__name<\/p>\n<p>@name.setter<br \/>\ndef name(self, new_name):<br \/>\nif new_name == \"\":<br \/>\nprint(\"Pusty \u0142a\u0144cuch znak\u00f3w nie mo\u017ce by\u0107 imieniem zwierzaka.\")<br \/>\nelse:<br \/>\nself.__name = new_name<br \/>\nprint(\"Zmiana imienia si\u0119 powiod\u0142a.\")<\/p>\n<p>def talk(self):<br \/>\nprint(\"\\nCze\u015b\u0107! Jestem\", self.name)<\/p>\n<p># cz\u0119\u015b\u0107 g\u0142\u00f3wna<br \/>\ncrit = Critter(\"Reksio\")<br \/>\ncrit.talk()<\/p>\n<p>print(\"\\nImi\u0119 mojego zwierzaka to:\", end= \" \")<br \/>\nprint(crit.name)<\/p>\n<p>print(\"\\nPr\u00f3buj\u0119 zmieni\u0107 imi\u0119 mojego zwierzaka na Pucek...\")<br \/>\ncrit.name = \"Pucek\"<br \/>\nprint(\"Imi\u0119 mojego zwierzaka to:\", end= \" \")<br \/>\nprint(crit.name)<\/p>\n<p>print(\"\\nPr\u00f3buj\u0119 zmieni\u0107 imi\u0119 mojego zwierzaka na pusty \u0142a\u0144cuch znak\u00f3w...\")<br \/>\ncrit.name = \"\"<br \/>\nprint(\"Imi\u0119 mojego zwierzaka to:\", end= \" \")<br \/>\nprint(crit.name)<\/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 \/>\nW\u0142a\u015bciwo\u015bci tworzymy poprzez wpisanie dekoratora @property a po nim metody umo\u017cliwiaj\u0105cej odczyt elementu w naszym przypadku jest to name(self). Mo\u017cemy tworzy\u0107 r\u00f3wnie\u017c metody umo\u017cliwiaj\u0105ce ograniczone mo\u017cliwo\u015bci modyfikacji. Tak\u0105 metod\u0119 mo\u017cecie Pa\u0144stwo zobaczy\u0107 w powy\u017cszym kodzie nazywa si\u0119 ona name(self, new_name). T\u0105 metod\u0119 r\u00f3wnie\u017c poprzedzamy dekoratorem, a mianowicie @name.setter<\/p>\n<h5> Dost\u0119p do w\u0142a\u015bciwo\u015bci<\/h5>\n<p>Stosuj\u0105c w\u0142a\u015bciwo\u015bci mo\u017cna realizowa\u0107 dost\u0119p do atrybut\u00f3w. Dzi\u0119ki stworzeniu w\u0142a\u015bciwo\u015bci name mo\u017cemy uzyska\u0107 dost\u0119p do atrybutu prywatnego: name. Teraz poni\u017cszy kod wy\u015bwietli informacje o imieniu naszego zwierzaka.<br \/>\n<code python=\"\"><br \/>\nprint(crit.name)<br \/>\n<\/code><\/p>\n<h4> Zadania do samodzielnego wykonania na laboratoriach<\/h4>\n<p>* przeanalizuj kod i om\u00f3w go na zaj\u0119ciach:<br \/>\n<code python=\"\"><br \/>\n# Opiekun zwierzaka<br \/>\n# Wirtualny pupil, kt\u00f3rym nale\u017cy si\u0119 opiekowa\u0107<\/code><\/p>\n<p><code python=\"\">class Critter(object):<br \/>\n\"\"\"Wirtualny pupil\"\"\"<br \/>\ndef __init__(self, name, hunger = 0, boredom = 0):<br \/>\nself.name = name<br \/>\nself.hunger = hunger<br \/>\nself.boredom = boredom<\/p>\n<p>def __pass_time(self):<br \/>\nself.hunger += 1<br \/>\nself.boredom += 1<\/p>\n<p><\/code><code python=\"\"><\/code><code python=\"\">    @property<br \/>\ndef mood(self):<br \/>\nunhappiness = self.hunger + self.boredom<br \/>\nif unhappiness &lt; 5:<br \/>\nm = \"szcz\u0119\u015bliwy\"<br \/>\nelif 5 &lt;= unhappiness &lt;= 10:<br \/>\nm = \"zadowolony\"<br \/>\nelif 11 &lt;= unhappiness &lt;= 15:<br \/>\nm = \"podenerwowany\"<br \/>\nelse:<br \/>\nm = \"w\u015bciek\u0142y\"<br \/>\nreturn m<\/code><\/p>\n<p><code python=\"\">    def talk(self):<br \/>\nprint(\"Nazywam si\u0119\", self.name, \"i jestem\", self.mood, \"teraz.\\n\")<br \/>\nself.__pass_time()<\/p>\n<p>def eat(self, food = 4):<br \/>\nprint(\"Mniam, mniam.  Dzi\u0119kuj\u0119.\")<br \/>\nself.hunger -= food<br \/>\nif self.hunger &lt; 0:<br \/>\nself.hunger = 0<br \/>\nself.__pass_time()<\/p>\n<p>def play(self, fun = 4):<br \/>\nprint(\"Hura!\")<br \/>\nself.boredom -= fun<br \/>\nif self.boredom &lt; 0:<br \/>\nself.boredom = 0<br \/>\nself.__pass_time()<\/p>\n<p>def main():<br \/>\ncrit_name = input(\"Jak chcesz nazwa\u0107 swojego zwierzaka?: \")<br \/>\ncrit = Critter(crit_name)<\/p>\n<p>choice = None<br \/>\nwhile choice != \"0\":<br \/>\nprint(\"\"\"\\n<br \/>\nOpiekun zwierzaka<\/p>\n<p>0 - zako\u0144cz<br \/>\n1 - s\u0142uchaj swojego zwierzaka<br \/>\n2 - nakarm swojego zwierzaka<br \/>\n3 - pobaw si\u0119 ze swoim zwierzakiem<br \/>\n\"\"\")<\/p>\n<p>choice = input(\"Wybierasz: \")<br \/>\nprint()<\/p>\n<p># wyjd\u017a z p\u0119tli<br \/>\nif choice == \"0\":<br \/>\nprint(\"Do widzenia.\")<\/p>\n<p># s\u0142uchaj swojego zwierzaka<br \/>\nelif choice == \"1\":<br \/>\ncrit.talk()<\/p>\n<p># nakarm swojego zwierzaka<br \/>\nelif choice == \"2\":<br \/>\ncrit.eat()<\/p>\n<p># pobaw si\u0119 ze swoim zwierzakiem<br \/>\nelif choice == \"3\":<br \/>\ncrit.play()<\/p>\n<p># nieznany wyb\u00f3r<br \/>\nelse:<br \/>\nprint(\"\\nNiestety,\", choice, \"nie jest prawid\u0142owym wyborem.\")<\/p>\n<p>main()<br \/>\ninput(\"\\n\\nAby zako\u0144czy\u0107 program, naci\u015bnij klawisz Enter.\")<\/p>\n<p><\/code><code python=\"\"><\/code><br \/>\n* Ulepsz powy\u017cszy program umo\u017cliwiaj\u0105c opiekunowi ustawienie ilo\u015bci po\u017cywienia podawanego zwierzakowi i czasu po\u015bwi\u0119conego na zabaw\u0119 z nim. Warto\u015bci te powinny wp\u0142ywa\u0107 na szybko\u015b\u0107 spadku poziomu g\u0142odu i nudy u zwierzaka.<br \/>\n* Napisz program symuluj\u0105cy telewizor, tworz\u0105c go jako obiekt. U\u017cytkownik powinien mie\u0107 mo\u017cliwo\u015b\u0107 wprowadzenia numeru kana\u0142u, oraz regulacji g\u0142o\u015bno\u015bci. Zaimplementuj mechanizm umo\u017cliwiaj\u0105cy utrzymywanie numeru kana\u0142u i g\u0142o\u015bno\u015bci we w\u0142a\u015bciwych zakresach. Zakresy to: numer kana\u0142u od 1-20, g\u0142o\u015bno\u015b\u0107 od 0-100<\/p>\n<h4> &#8211; Przyk\u0142ady u\u017cywane na laboratoriach<\/h4>\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* Utw\u00f3rz w programie opiekun zwierzaka mechanizm &#8220;tylnych drzwi&#8221;, kt\u00f3ry pokazuje dok\u0142adnie warto\u015bci atrybut\u00f3w obiektu. Zrealizuj to poprzez wy\u015bwietlenie obiektu po wprowadzeniu przez u\u017cytkownika ukrytej warto\u015bci (nieopisanej w menu). **WSKAZ\u00d3WKA** dodaj specjaln\u0105 metod\u0119 str do klasy critter (o tej metodzie m\u00f3wili\u015bmy na poprzednich zaj\u0119ciach).<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 2 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, * atrybuty prywatne, * metody prywatne, * w\u0142a\u015bciwo\u015bci. &#8211; Zadanie przypominaj\u0105ce [&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\/323"}],"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=323"}],"version-history":[{"count":2,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/323\/revisions"}],"predecessor-version":[{"id":326,"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=\/wp\/v2\/pages\/323\/revisions\/326"}],"wp:attachment":[{"href":"https:\/\/stachura-terlecka.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}