3. OOP Basic

3.1. Access modifiers

  • All fields are always public

  • No protected i private

  • _nazwa - private fields (by convention)

  • __nazwa__ - system methods

  • nazwa_ - used while name collision

Listing 285. _nazwa - private fields (by convention)
class Astronaut:
    def __init__(self):
        self.first_name = 'Jan'         # public
        self.last_name = 'Twardowski'   # public
        self._agency = 'POLSA'          # private


twardowski = Astronaut()

twardowski.first_name   # Jan
twardowski.last_name    # Twardowski
twardowski._agency      # POLSA         # Good IDE will tell you, that you access private member
Listing 286. nazwa_ - used while name collision
class MyClass:
    def print_(self):
        """avoid name collision with print"""
        print('Printing...')
Listing 287. __nazwa__ - system methods
class Astronaut:
    def __str__(self):
        return f'My name... Jose Jimenez'


jose = Astronaut()

print(jose)
# My name... Jose Jimenez

3.2. __dict__ - Getting dynamic fields and values

Listing 288. __dict__ - Getting dynamic fields and values
class Iris:
    def __init__(self, sepal_length, sepal_width,
                 petal_length, petal_width, species):

        self.sepal_length = sepal_length
        self.sepal_width = sepal_width
        self.petal_length = petal_length
        self.petal_width = petal_width
        self.species = species


flower = Iris(
    sepal_length=5.1,
    sepal_width=3.5,
    petal_length=1.4,
    petal_width=0.2,
    species='setosa')

flower.__dict__
# {'sepal_length': 5.1,
# 'sepal_width': 3.5,
# 'petal_length': 1.4,
# 'petal_width': 0.2,
# 'species': 'setosa'}

3.3. Good engineering practices

  • Never print in a class

  • Osobne pliki - gdy klasy są duże

  • Jeden plik - gdy klasy są małe i czytelne

Listing 289. Classes and Objects
class IrisSetosa:
    pass

class IrisVersicolor:
    pass

class IrisVirginica:
    pass


setosa = IrisSetosa()
versicolor = IrisVersicolor()
virginica = IrisVirginica()

3.4. Assignments

3.4.1. Dragon (version alpha)

../_images/dragon.gif

Figure 34. Firkraag dragon from game Baldur's Gate II: Shadows of Amn

  1. Zadanie jest specyfikacją wymagań biznesowych, a nie dokumentacją techniczną. tj. "co Smok ma robić, a nie jak to ma robić"

  2. Smok ma:

    • nazwę

    • pozycję x na ekranie

    • pozycję y na ekranie

    • nazwę pliku tekstury, domyślnie img/dragon/alive.png

    • punkty życia, domyślnie losowy int z zakresu od 50 do 100

  3. Smok może:

    • być ustawiony w dowolne miejsce ekranu

    • zadawać komuś losowe obrażenia z przedziału od 5 do 20

    • otrzymywać obrażenia

    • być przesuwany o zadaną liczbę punktów w którymś z kierunków

  4. Przyjmij górny lewy róg ekranu za punkt początkowy:

    • 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

  5. Jest to wersja alpha więc bez dodatkowych funkcjonalności

  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:

    • Smok jest martwy

    • ustaw status obiektu na dead

    • na ekranie ma pojawić się napis XXX is dead gdzie XXX to nazwa smoka

    • zmień nazwę pliku tekstury na img/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ął

    • Nie można zadawać mu obrażeń

    • Smok nie może zadawać obrażeń

    • Smok nie może się poruszać

  8. Przeprowadź grę:

    • Stwórz smoka w pozycji x=50, y=120 i nazwij go Wawelski

    • Ustaw nową pozycję na x=10, y=20

    • Przesuń smoka o 10 w lewo i 20 w dół

    • Przesuń smoka o 10 w lewo i 15 w prawo

    • Przesuń smoka o 15 w prawo i 5 w górę

    • Przesuń smoka o 5 w dół

    • Zadaj 10 obrażeń smokowi

    • Zadaj 5 obrażeń smokowi

    • Zadaj 3 obrażeń smokowi

    • Zadaj 2 obrażeń smokowi

    • Zadaj 15 obrażeń smokowi

    • Zadaj 25 obrażeń smokowi

    • Zadaj 75 obrażeń smokowi

  9. Pozycja Smoka na końcu powinna być x=20, y=40

  10. Możesz wprowadzać dodatkowe pola, metody, funkcje, zmienne, stały, klasy, obiekty, co tylko chcesz

  11. Nie musisz trzymać się kolejności punktów i podpunktów w zadaniu

  12. Nie przeglądaj kolejnych (przyszłych) części zadania. Zadanie jest symulacją pewnego procesu. Jeżeli zaglądniesz w przód, to zepsujesz sobie zabawę.

The whys and wherefores
  • "Smok" jest tylko narracją do demonstracji praktyk

  • myślenie obiektowe i odwzorowanie struktury w programie

  • tworzenie i praca z obiektami

  • zagnieżdżanie obiektów

  • specyfikacja interfejsów klas

  • interakcja między obiektami

  • podział aplikacji na warstwy

  • dobre praktyki programistyczne

Hint
  • from random import randint

3.4.2. Bank i Bankomaty

  • Complexity level: medium

  • Lines of code to write: 60 lines

  • Estimated time of completion: 20 min

  • Filename: solution/basic_bank.py

  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