Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
320 lines (242 sloc) 11 KB

Object Oriented Programming

Object Paradigm

  • Odwzorowanie świata na obiekty i relacje między nimi

Classes and Objects

.. literalinclude:: src/oop-class.py
    :language: python
    :caption: Classes and Objects


Fields

Static Fields

  • Simple to use
  • Must have default values
  • Share state
.. literalinclude:: src/oop-fields-static.py
    :language: python
    :caption: Static Fields

Dynamic Fields

  • Require __init__()
.. literalinclude:: src/oop-fields-dynamic.py
    :language: python
    :caption: Dynamic fields

Static vs. Dynamic Fields

.. literalinclude:: src/oop-fields-static-vs-dynamic.py
    :language: python
    :caption: Static vs. Dynamic fields

__dict__ - Getting dynamic fields and values

.. literalinclude:: src/oop-fields-dict.py
    :language: python
    :caption: ``__dict__`` - Getting dynamic fields and values


Methods

.. literalinclude:: src/oop-methods-noargs.py
    :language: python
    :caption: Methods

.. literalinclude:: src/oop-methods-args.py
    :language: python
    :caption: Methods

self - Instance as an argument

  • self - pierwszy argument do metody
  • wyjątek to metody z dekoratorem @staticmethod (o tym będzie później)
  • przy uruchomieniu funkcji nie podajemy jawnie argumentu self
.. literalinclude:: src/oop-methods-self.py
    :language: python
    :caption: Methods argument ``self``

__init__() - Initializer Method

  • __init__() to nie konstruktor
  • Domyślny __init__() gdy niezdefiniowaliśmy własnego
  • Inicjalizacja pól klasy tylko w __init__
.. literalinclude:: src/oop-fields-dynamic.py
    :language: python
    :caption: Fields added dynamically

.. literalinclude:: src/oop-init.py
    :language: python
    :caption: ``__init__()`` - Initializer Method

__str__() - Stringify object

  • print converts it's arguments to str() automatically before printing
.. literalinclude:: src/oop-str-without.py
    :language: python
    :caption: Print object without ``__str__()`` method overloaded

.. literalinclude:: src/oop-str-with.py
    :language: python
    :caption: Stringify object


Inheritance

.. literalinclude:: src/oop-inheritance.py
    :language: python
    :caption: Inheritance

Multilevel Inheritance

.. literalinclude:: src/oop-inheritance-multilevel.py
    :language: python
    :caption: Multilevel Inheritance

Multiple Inheritance

.. literalinclude:: src/oop-inheritance-multiple.py
    :language: python
    :caption: Multiple Inheritance

Note

The topic will be continued in :ref:`Advanced OOP` chapter

super() - Calling object parent

.. literalinclude:: src/oop-super.py
    :language: python
    :caption: Using ``super()`` on a class

Enum

.. literalinclude:: src/oop-enum.py
    :language: python
    :caption: ``enum`` - Support for enumerations

.. literalinclude:: src/oop-enum-example.py
    :language: python
    :caption: ``enum`` - Example usage


One class per file?

  • Jeden plik - gdy klasy są małe i czytelne
  • Osobne pliki - gdy klasy są duże

More advanced topics

Note

The topic will be continued in :ref:`Advanced OOP` chapter

Assignments

Bank i Bankomaty

  1. Klient może otworzyć konto w banku
  2. Bank może mieć wiele kont dla różnych klientów
  3. Każde konto ma unikalny numer, który jest generowany przy zakładaniu
  4. Klient może odpytać o swój numer
  5. Klient może wpłacić pieniądze na swoje konto
  6. Klient może wybrać pieniądze z bankomatu
About:
  • Filename: oop_bank.py
  • Lines of code to write: 60 lines
  • Estimated time of completion: 20 min

Dragon (Easy)

Note

Jeżeli konieczne jest wprowadzenie nowej metody, klasy lub pól to należy to zrobić

  1. Skopiuj kod gry z listingu :numref:`listing-oop-dragon`

  2. Smok ma mieć:

    • nazwę smoka
    • pozycja x na ekranie
    • pozycja y na ekranie
    • teksturę, domyślnie dragon.png
    • punkty życia, domyślnie losowy int z zakresu od 50 do 100
  3. Smok może:

    • otrzymywać obrażenia
    • zadawać komuś losowe obrażenia z przedziału od 5 do 20
    • być ustawiony w dowolne miejsce ekranu
    • być przesuwany o zadaną liczbę punktów w którymś z kierunków
  4. Przesuwając smoka, można podać tylko niektóre kierunki, np: right=30, down=50 lub up=20

  5. Przyjmij górny lewy róg ekranu za punkt (0, 0)

    • idąc w prawo dodajesz x
    • idąc w lewo odejmujesz x
    • idąc w górę odejmujesz y
    • idąc w dół dodajesz y
  6. Przy każdym obrażeniu wypisz na ekranie nazwę smoka, ilość obrażeń i pozostałe punkty życia

  7. Kiedy punkty życia smoka spadną do, lub poniżej zera:

    • ustaw status obiektu na dead
    • na ekranie ma pojawić się napis 'Dragon is dead'
    • zmień teksturę smoka na dragon-dead.png
    • na ekranie pojawi się informacja ile złota smok wyrzucił (losowa 1-100)
    • na ekranie pojawi się informacja o pozycji gdzie smok zginął
  8. Nie można zadawać smokowi obrażeń, jeżeli już nie żyje

About:
  • Filename: oop_dragon_easy.py
  • Lines of code to write: 40 lines
  • Estimated time of completion: 75 min
.. literalinclude:: assignment/oop_dragon.py
    :name: listing-oop-dragon
    :language: python
    :caption: Dragon API

Dragon (Medium)

Note

Jeżeli konieczne jest wprowadzenie nowej metody, klasy lub pól to należy to zrobić

  1. Zaimportuj smoka z zadania podstawowego rozszerz go przez dziedziczenie

  2. Smok nie może wyjść poza obszar ekranu (1024x768) + napis doctest

  3. Jeżeli dojdzie do granicy ekranu, to przesuwając dalej, pozycja będzie ustawiona na maks

  4. Stwórz bohatera (José Jiménez):

    • losowe punkty życia (100-150)
    • zadaje losowe obrażenia (1-15)
    • klasa postaci (domyślnie "wojownik")
  5. Wszystkie istoty mają statusy:

    • "Pełnia życia" (zastąp status "alive") - gdy punkty życia 100%
    • "Lekko Ranny" - gdy punkty życia 99% - 75%
    • "Poważnie ranny" - gdy punkty życia 75% - 25%
    • "Na skraju śmierci" - gdy punkty życia poniżej 25%
  6. Bohater przejmuje złoto smoka, jeżeli go zabije

  7. Przeprowadź symulację walki. Kto zginie pierwszy?

About:
  • Filename: oop_dragon_medium.py
  • Lines of code to write: 100 lines
  • Estimated time of completion: 60 min
Hint:
  • Aby zaimportować trzeba najpierw w katalogu stworzyć pusty plik __init__.py

Dragon (Advanced)

  1. Dodaj możliwość poruszania się smoka i bohatera w 3 wymiarach

  2. Bohater może należeć do drużyny, który może składać się maks z 6 postaci (różnych klas)

  3. Żadna z istot na planszy nie może wyjść poza zakres ekranu

  4. Bohater może dodatkowo założyć ekwipunek i może być to wiele obiektów na raz

  5. Każdy z przedmiotów ma swoją nazwę, typ oraz modyfikator

    • zbroję (dodatkowe punkty obrony, np. +10%)
    • tarczę (dodatkowe punkty obrony, np. +5%)
    • miecz (dodatkowe punkty ataku, np. +5%)
  6. Zbroja i tarcza chroni przed uderzeniami obniżając ilość obrażeń o wartość obrony

  7. Miecz zwiększa ilość zadawanych obrażeń

  8. Obrażenia smoka maleją z sześcianem odległości (zianie ogniem)

  9. Bohater nie może zadawać obrażeń jak jest dalej niż 50 punktów od przeciwnika

  10. Wszystkie istoty mogą lewelować a bazowe punty życia i obrażeń się zmieniają z poziomem

  11. Przeprowadź symulację walki. Kto zginie pierwszy?

About:
  • Filename: oop_dragon_advanced.py
  • Lines of code to write: 50 lines
  • Estimated time of completion: 30 min

Address Book (Easy)

  1. Dla danych z :numref:`listing-oop-addressbook-easy` napisz książkę adresową
  2. Wszystkie dane w książce muszą być reprezentowane przez klasy.
  3. Klasy powinny wykorzystywać domyślne argumenty w __init__.
  4. Użytkownik może mieć wiele adresów.
  5. Użytkownik może nie mieć żadnego adresu
About:
  • Filename: oop_addressbook_easy.py
  • Lines of code to write: 10 lines
  • Estimated time of completion: 20 min
The whys and wherefores:
  • myślenie obiektowe i odwzorowanie struktury w programie
  • praca z obiektami
  • zagnieżdżanie obiektów
  • rzutowanie obiektu na stringa oraz jego reprezentacja (które i kiedy użyć)
.. literalinclude:: assignment/addressbook_easy.py
    :name: listing-oop-addressbook-easy
    :language: python
    :caption: Address Book

Points and Vectors

Przekształć swój kod z przykładu z modułu "Matematyka" tak żeby wykorzystywał klasy.

Zadanie 0:

Napisz klasę ObiektGraficzny, która implementuje "wirtualną" funkcję plot(). Niech domyślnie ta funkcja podnosi NotImplementedError (podpowiedź: raise NotImplementedError).

Zadanie 1:

Napisz klasę Punkt, która dziedziczy po ObiektGraficzny, która będzie miała "ukryte" pola _x, _y. Konstruktor tej klasy ma przyjmować współrzędne x oraz y jako argumenty. Napisz obsługę pól ukrytych _x oraz _y jako @property tej klasy (obsługiwane jako x oraz y). Dopisz implementacje metod __str__ oraz __repr__. Zaimplementuj metodę plot(kolor), która wyrysuje ten punkt na aktualnie aktywnym wykresie. Kolor domyślnie powinien przyjmować wartość 'black'.

Dopisz do tej klasy metodę statyczną, która zwróci losowy punkt w podobny sposób jak funkcja random_point(center, std) zwracała obiekt dwuelementowy.

Zadanie 2:

Dopisz do tej klasy dwie metody, które pozwolą obliczyć odległość między dwoma punktami. Jedna z tych metod niech będzie metodą statyczną, która przyjmuje dwa punkty jako argumenty, a zwraca odległość między nimi (przykładowe wywołanie tej metody: Punkt.oblicz_odleglosc_miedzy_punktami(punkt_A, punkt_B)). Druga z tych metod niech będzie zwykłą metodą klasy, która przyjmie jeden punkt jako argument oraz obliczy odległość od tego punktu do punktu na którym jest wykonywana (punkt_A.oblicz_odleglosc_do(punkt_B)).

Zadanie 3:

Napisz kod, który wykorzystując klasę zaimplementowaną w przykładzie powyżej, wygeneruje listę losowych punktów wokół punktów A i B. Wyrysuj te punkty na wykresie, podobnie jak w przykładzie z modułu "Matematyka".

Zadanie 4:

Napisz kod, który zaklasyfikuje te losowo wygenerowane punkty do punktów A oraz B na podstawie odległości. W tym celu wykorzystaj napisane metody do obliczania odległości między punktami. Po klasyfikacji wyrysuj te punkty na wykresie, podobnie jak w przykładzie z modułu "Matematyka".

About:
  • Filename: oop-vector.py
  • Lines of code to write: 20 lines
  • Estimated time of completion: 30 min