2. OOP Intermediate

2.1. Fields

2.1.1. Static Fields

  • Simple to use
  • Must have default values
  • Share state
Code Listing 2.15. Static Fields
class Astronaut:
    first_name = 'José'
    last_name = 'Jiménez'
    agency: str = 'NASA'
    age: int = 30


jose = Astronaut()
jose.first_name     # José

2.1.2. Dynamic Fields

  • Require __init__()
Code Listing 2.16. Dynamic fields
class Astronaut:
    def __init__(self, name, age=30, agency='NASA'):
        self.name = name
        self.agency = agency
        self.age = age


jose = Astronaut(name='José Jiménez')
ivan = Astronaut(name='Иван Иванович', agency='Roscosmos')

jose.agency     # NASA
ivan.agency     # Roscosmos

2.1.3. Static vs. Dynamic Fields

Code Listing 2.17. Static vs. Dynamic fields
class Astronaut:
    agency = 'NASA'

    def __init__(self, name):
        self.name = name


ivan = Astronaut(name='Иван Иванович')
jose = Astronaut(name='José Jiménez')
mark = Astronaut(name='Mark Watney')


# Check value of field agency
ivan.agency         # NASA
jose.agency         # NASA
mark.agency         # NASA
Astronaut.agency    # NASA


# Let's change Agency of ``ivan``
ivan.agency = 'Roscosmos'

ivan.agency         # Roscosmos
jose.agency         # NASA
mark.agency         # NASA
Astronaut.agency    # NASA


# Let's change agency of ``Astronaut`` class
Astronaut.agency = 'ESA'

ivan.agency         # Roscosmos
jose.agency         # ESA
mark.agency         # ESA
Astronaut.agency    # ESA

2.1.4. __dict__ - Getting dynamic fields and values

Code Listing 2.18. __dict__ - Getting dynamic fields and values
class Astronaut:
    def __init__(self, name, agency='NASA'):
        self.name = name
        self.agency = agency


jose = Astronaut(name='José Jiménez')
ivan = Astronaut(name='Иван Иванович', agency='Roscosmos')

jose.__dict__    # {'name': 'José Jiménez', 'agency': 'NASA'}
ivan.__dict__    # {'name': 'Иван Иванович', 'agency': 'Roscosmos'}

2.2. Initial arguments mutability and shared state

Code Listing 2.19. Initial arguments mutability and shared state
class Address:
    def __init__(self, address):
        self.address = address

    def __repr__(self):
        return str(self.address)


class Contact:
    def __init__(self, name, addresses=[]):
        self.name = name
        self.addresses = addresses


jose = Contact(name='Jose Jimenez')
jsc = Address('2101 E NASA Pkwy, Houston, TX')
jose.addresses.append(jsc)
print(jose.addresses)
# [2101 E NASA Pkwy, Houston, TX]

ivan = Contact(name='Ivan Ivanovich')
print(ivan.addresses)
# [2101 E NASA Pkwy, Houston, TX]

2.3. Inheritance

Code Listing 2.20. Inheritance
class Spaceman:
    agency = None

    def __init__(self, name):
        self.name = name

    def get_agency(self):
        return self.agency


class Astronaut(Spaceman):
    agency = 'NASA'


class Cosmonaut(Spaceman):
    agency = 'Roscosmos'


jose = Astronaut(name='José Jiménez')
ivan = Cosmonaut(name='Иван Иванович')


jose.get_agency()       # NASA
ivan.get_agency()       # Roscosmos

2.3.1. Multilevel Inheritance

Code Listing 2.21. Multilevel Inheritance
class Pilot:
    current_job = 'Pilot'

    def __init__(self, name):
        self.name = name

    def say_hallo(self):
        print(f'My name... {self.name}')


class CosmonautPilot(Pilot):
    current_job = 'Cosmonaut'
    previous_job = 'Pilot'


class GieroyCosmonautPilot(CosmonautPilot):
    status = 'Gieroy'


ivan = GieroyCosmonautPilot(name='Иван Иванович')

ivan.say_hallo()        # Здравствуйте... Иван Иванович
ivan.current_job        # Cosmonaut
ivan.previous_job       # Pilot
ivan.status             # Gieroy

2.3.2. Multiple Inheritance

Code Listing 2.22. Multiple Inheritance
class Cosmonaut:
    job = 'Cosmonaut'
    agency = 'Roscosmos'


class Pilot:
    job = 'Pilot'


class Gieroy:
    status = 'Gieroy'


class GeroySovietskogoSoyuza(Gieroy, Cosmonaut, Pilot):
    def __init__(self, name):
        self.name = name


ivan = GeroySovietskogoSoyuza(name='Иван Иванович')

ivan.job        # 'Cosmonaut'
ivan.status     # 'Gieroy'
ivan.agency     # 'Roscosmos'

2.3.3. super() - Calling object parent

Code Listing 2.23. Using super() on a class
class Astronaut:
    def say_hello(self):
        print('I am an astronaut')


class FictionalAstronaut(Astronaut):
    def say_hello(self):
        print(f'My name... José Jiménez')
        super().say_hello()


jose = FictionalAstronaut()
jose.say_hello()
# My name... José Jiménez
# I am an astronaut

2.4. More advanced topics

Note

The topic will be continued in OOP Advanced chapter

2.5. Assignments

2.5.1. Dragon (Part 2)

  1. Zaimportuj smoka z poprzedniej części zadania (“Part 1”)

  2. Wykorzystaj mechanizm dziedziczenia dla Smoka

  3. Nie modyfikuj klasy smoka z poprzedniej części

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

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

  6. Zmień smokowi punkty życia na losowy int z zakresu 100 do 150

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

    • losowe punkty życia (200-250)
    • zadaje losowe obrażenia (1-15)
    • klasa postaci (domyślnie “Warrior”)
    • Bohater może przyjmować obrażenia
    • Bohater może zginąć
    • Bohater może poruszać się po planszy
  8. Wszystkie istoty mają statusy:

    • “Full Health” - gdy punkty życia 100% (zastąp status “alive”)
    • “Injured” - gdy punkty życia 99% - 75%
    • “Badly Wounded” - gdy punkty życia 75% - 25%
    • “Near Death” - gdy punkty życia 25% - 1%
    • “Dead” - gdy punkty życia poniżej lub równe 0%
  9. Bohater przejmuje złoto smoka, jeżeli go zabije

  10. Przeprowadź walkę, tak długo aż ktoś pierwszy nie zginie

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

About:
  • Filename: oop_dragon_2.py
  • Lines of code to write: 120 lines
  • Estimated time of completion: 60 min
  • Don’t delete code, assignment will be continued
Hint:
  • Aby zaimportować trzeba najpierw w katalogu stworzyć pusty plik __init__.py

2.5.2. 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