<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Domácí projekt - vlastní třída pro celá čísla
Vytvoř si vlastní třídu pro celá čísla tak, aby tato nová třída měla všechny vlastnosti a schopnosti běžných celých čísel v Pythonu (objekty bude možné sčítat, odečítat, porovnávat atp.) a navíc měla metodu pro rozpoznání, zda je číslo v objektu sudé nebo liché jménem je_sude(), která bude vracet True nebo False.
Řešení vlastní metody
Nejsmazší je dědit přímo z třídy int a přidat jen jednu vlastní metodu.
Step1:  Řešení bonusu - vlastní metody repr
Metoda __repr__ vrací řetězec, který reprezentuje objekt například při výpisu v interaktivní konzoli. Tato metoda může vracet libovolný řetězec.
Step2:  Kompatibilita
Kompatibilita zůstala díky dědění zachována.
Step3:  Vlastní objekty a speciální metody
Pro domácí projekt to nebylo potřeba, ale pojďme si zkusit vytvořit vlastní třídu s implementovanými metodami pro využití operátorů v Pythonu.
Step4:  Matematika
Pro matematické operátory existují speciální metody, jejichž názvy odpovídají použitým operátorům/operacím.
Step5:  Porovnávání
Pro porovnání máme také speciální metody - pro každý operátor jednu.
Step6:  Řazení
Řazení je jen speciální případ porovnávání, kdy se mezi sebou porovnají všechny prvky a podle výsledku jednotlivých porovnání se seřadí. K tomu nám stačí mít implementovánu alespoň metodu __lt__.
<ASSISTANT_TASK:>
Python Code:
class CeleCislo(int):
    def je_sude(self):
        return self % 2 == 0
x = CeleCislo(5)
x.je_sude()
y = CeleCislo(6)
y.je_sude()
Explanation: Domácí projekt - vlastní třída pro celá čísla
Vytvoř si vlastní třídu pro celá čísla tak, aby tato nová třída měla všechny vlastnosti a schopnosti běžných celých čísel v Pythonu (objekty bude možné sčítat, odečítat, porovnávat atp.) a navíc měla metodu pro rozpoznání, zda je číslo v objektu sudé nebo liché jménem je_sude(), která bude vracet True nebo False.
Řešení vlastní metody
Nejsmazší je dědit přímo z třídy int a přidat jen jednu vlastní metodu.
End of explanation
class CeleCislo(int):
    def je_sude(self):
        return self % 2 == 0
    
    def __repr__(self):
        return "<Cele cislo {}>".format(self)
y = 5
y
x = CeleCislo(5)
x
Explanation: Řešení bonusu - vlastní metody repr
Metoda __repr__ vrací řetězec, který reprezentuje objekt například při výpisu v interaktivní konzoli. Tato metoda může vracet libovolný řetězec.
End of explanation
a = 5
b = CeleCislo(7)
a + b
a - b
a < b
b >= a
Explanation: Kompatibilita
Kompatibilita zůstala díky dědění zachována.
End of explanation
class Pizza:
    def __init__(self, jmeno, ingredience):
        self.jmeno = jmeno
        self.ingredience = ingredience
    
    def __repr__(self):
        return "<Pizza '{}' na které je '{}'".format(self.jmeno, self.ingredience)
p = Pizza("salámová", ["sýr", "paprikáš", "suchý salám"])
p
Explanation: Vlastní objekty a speciální metody
Pro domácí projekt to nebylo potřeba, ale pojďme si zkusit vytvořit vlastní třídu s implementovanými metodami pro využití operátorů v Pythonu.
End of explanation
class Pizza:
    def __init__(self, jmeno, ingredience):
        self.jmeno = jmeno
        self.ingredience = ingredience
    
    def __repr__(self):
        return "<Pizza '{}' na které je '{}'".format(self.jmeno, self.ingredience)
    
    def __add__(self, other):
        jmeno = self.jmeno + " " + other.jmeno
        ingredience = self.ingredience + other.ingredience
        return Pizza(jmeno, ingredience)
p1 = Pizza("salámová", ["sýr", "paprikáš", "suchý salám"])
p2 = Pizza("hawai", ["máslo", "ananas"])
p1 + p2
p2 - p1
Explanation: Matematika
Pro matematické operátory existují speciální metody, jejichž názvy odpovídají použitým operátorům/operacím.
End of explanation
class Pizza:
    def __init__(self, jmeno, ingredience):
        self.jmeno = jmeno
        self.ingredience = ingredience
    
    def __repr__(self):
        return "<Pizza '{}' na které je '{}'".format(self.jmeno, self.ingredience)
    
    def __add__(self, other):
        jmeno = self.jmeno + " " + other.jmeno
        ingredience = self.ingredience + other.ingredience
        return Pizza(jmeno, ingredience)
    
    def __lt__(self, other):
        return len(self.ingredience) < len(other.ingredience)
p1 = Pizza("salámová", ["sýr", "paprikáš", "suchý salám"])
p2 = Pizza("hawai", ["máslo", "ananas"])
p3 = Pizza("pro chude", ["eidam"])
p4 = p1 + p2
p3 < p1
p3 > p1
p4 < p2
Explanation: Porovnávání
Pro porovnání máme také speciální metody - pro každý operátor jednu.
End of explanation
pizzy = [p1, p2, p3, p4]
pizzy
sorted(pizzy)
Explanation: Řazení
Řazení je jen speciální případ porovnávání, kdy se mezi sebou porovnají všechny prvky a podle výsledku jednotlivých porovnání se seřadí. K tomu nám stačí mít implementovánu alespoň metodu __lt__.
End of explanation
<END_TASK>