Kódím.cz
2

Třídy a objekty

Třídy a objekty jsou způsob, jak strukturovat program. Tato kapitola nás uvede do světa objektově orientovaného programování.

Další metody

Oproti motivačnímu příkladu stále nemáme vyřešeno "bezpečné" čerpání dovolené. Na to se podíváme nyní. Zkusme nyní naši třídu obohatit o novou metodu - take_holiday(). Budeme hlídat i to, aby zaměstnanec/zaměstnankyně nárok na dovolenou nepřečerpal(a).

class Employee:
    def __init__(self, name, position, holiday_entitlement):
        self.name = name
        self.position = position
        self.holiday_entitlement = holiday_entitlement

    def get_info(self):
        return f"Zaměstnanec {self.name} pracuje na pozici {self.position}."

    def take_holiday(self, days):
        if self.holiday_entitlement >= days:
            self.holiday_entitlement -= days
            return f"Užij si to."
        else:
            return f"Bohužel už máš nárok jen na {self.holiday_entitlement} dní."

Nyní se podívejme, jak budou vyřizovány Františkovy žádosti o dovolenou.

frantisek = Employee("František Novák", "konstruktér", 25)

print(frantisek.take_holiday(5))
print(frantisek.take_holiday(15))
print(frantisek.take_holiday(10))

Pojďme ještě použití naší třídy trochu zjednodušit. Naše třída umí přehledně vypsat informace díky metodě get_info(). Třídu ale může používat někdo, kdo si této metody nevšimne a tak intuitivně vyzkouší funkci print().

print(frantisek)

Odpovědí bude poněkud záhadný text ve stylu

<__main__.Employee object at 0x00000126F0084850>

Funke print() se totiž pokusí převést objekt na typ řetězec. Protože naše třída nemá tuto funkci naprogramovanou, použije se standardní formát, který nám říká, že jde o objekt třídy Employee a kde je uložený v paměti (což je nám platné jako mrtvému zimník). Místo toho by bylo mnohem užitečnější získat informaci, jak ji máme připravenou v metodě get_info().

Převod na řetězec zařídíme tím, že třídě přidáme metodu __str__. Dvě lomítka opět značný zvláštní význam. Ten spočívá v tom, že Python využije tuto metodu vždy, když jej požádáme o převod objektu na řetězec. Můžeme tedy přejmenovat metodu get_info() na __str__. Výstupem našeho programu pak bude text o tom, jak se zaměstnanec jmenuje a kde pracuje.

class Employee:
    def __init__(self, name, position, holiday_entitlement):
        self.name = name
        self.position = position
        self.holiday_entitlement = holiday_entitlement

    def __str__(self):
        return f"Zaměstnanec {self.name} pracuje na pozici {self.position}."

    def take_holiday(self, days):
        if self.holiday_entitlement >= days:
            self.holiday_entitlement -= days
            return f"Užij si to."
        else:
            return f"Bohužel už máš nárok jen na {self.holiday_entitlement} dní."

frantisek = Employee("František Novák", "konstruktér", 25)
print(frantisek)

Tím jsme si ukázali, jak vytvořit třídu, objekty a jak s nimi pracovat.

Cvičení

Bonus