Tento článok sa zaoberá polymorfizmom, preťažovaním operátorov a spracovaním výnimiek v jazyku Python, pričom vychádza z konceptu "invalid add význam" (neplatný význam sčítania). Analyzuje rôzne aspekty polymorfizmu, odlišnosti v správaní metód v odvodených triedach, preťažovanie operátorov pomocou magických metód, až po robustné spracovanie chýb pomocou konštrukcií try-except. Článok tiež pokrýva prácu so súbormi, hľadanie hodnôt v dátových štruktúrach a vytváranie vlastných typov výnimiek.

Polymorfizmus v praxi: Rôzne objekty, rovnaká metóda, odlišné správanie
Polymorfizmus je základný koncept objektovo orientovaného programovania, ktorý umožňuje, aby sa objekty rôznych tried správali odlišne, aj keď sú volané rovnakou metódou. Používateľ uviedol príklad s triedou MojaTurtle a jej odvodenými triedami MojaTurtle1 a MojaTurtle2, kde každá trieda implementuje metódu domcek() iným spôsobom.
class MojaTurtle: def domcek(self): # Kreslenie domčeka pomocou štandardných príkazov fd() self.fd(dlzka)class MojaTurtle1(MojaTurtle): def domcek(self): # Kreslenie domčeka cikcakovým spôsobom self.fd(dlzka) # fd z triedy ???class MojaTurtle2(MojaTurtle): def lt(self, uhol): # Prekryješ lt(uhol) aj rt(uhol), v ktorých sa zmení otočenie na uhol+randint(-5,5). super().lt(uhol + randint(-5, 5)) def rt(self, uhol): super().rt(uhol + randint(-5, 5))# Vytvorenie zoznamu korytnačiek rôznych typovzoznam_korytnaciek = [MojaTurtle(), MojaTurtle1(), MojaTurtle2()]# Každá korytnačka nakreslí domček po svojomfor korytnacka in zoznam_korytnaciek: korytnacka.domcek()
V tomto príklade, hoci všetky objekty v zozname majú metódu domcek(), každá ju vykonáva inak, vďaka dedičnosti a prekrývaniu metód. Python umožňuje vytvárať zoznamy rôznych typov, čo je v iných jazykoch ako Pascal alebo C++ menej bežné, kde sa zvyčajne vyžaduje, aby všetky prvky poľa boli rovnakého typu.

Operátorový polymorfizmus a preťažovanie operátorov
Polymorfizmus sa neobmedzuje len na metódy definované používateľom. Operátory ako +, -, * atď. sa tiež správajú polymorfne. Operácia a + b sa v skutočnosti prekladá ako volanie metódy a.__add__(b).
class Cas: def __init__(self, hodiny, minuty, sekundy): self.hodiny = hodiny self.minuty = minuty self.sekundy = sekundy def __add__(self, other): # Preťaženie operátora + pre sčítanie dvoch časov sekundy = self.sekundy + other.sekundy minuty = self.minuty + other.minuty + sekundy // 60 hodiny = self.hodiny + other.hodiny + minuty // 60 sekundy %= 60 minuty %= 60 hodiny %= 24 return Cas(hodiny, minuty, sekundy) def __str__(self): return f"{self.hodiny:02d}:{self.minuty:02d}:{self.sekundy:02d}"# Príklad použitiacas1 = Cas(10, 30, 45)cas2 = Cas(2, 15, 20)cas3 = cas1 + cas2print(cas3) # Výstup: 12:46:05Preťažením operátora + sme triede Cas priradili nový význam pre operáciu sčítania, čo umožňuje jednoduché a intuitívne sčítanie časových údajov. Podobne, pre triedu Zlomok by bolo užitočné preťažiť operátory pre sčítanie, odčítanie, násobenie a delenie zlomkov.
Preťaženie operátorov v Pythone | 50
Spracovanie výnimiek: Elegantné riešenie chýb
Python poskytuje mechanizmus na spracovanie výnimiek pomocou blokov try-except. Namiesto toho, aby sme sa snažili predísť všetkým možným chybám, môžeme ich "ošetriť", keď nastanú.
def cele(hodnota): """ Prevedie danú hodnotu na celé číslo. Ak sa to nedá, vráti 0. """ try: return int(hodnota) except (ValueError, TypeError): return 0# Príklad použitiaprint(cele("123")) # Výstup: 123print(cele("abc")) # Výstup: 0print(cele(1.5)) # Výstup: 1V tomto príklade, ak sa funkcia int() pokúsi previesť reťazec, ktorý nie je číselný, vyvolá sa výnimka ValueError. Blok except túto výnimku zachytí a vráti 0. Podobne, ak by sa funkcii cele() odovzdal objekt, ktorý sa nedá prekonvertovať na celé číslo, vyvolala by sa výnimka TypeError, ktorá by bola tiež zachytená a spracovaná.

Konštrukcia try-except umožňuje elegantné riešenie chýb a zabraňuje spadnutiu programu. Je dôležité špecifikovať typ výnimky, ktorú chceme zachytiť, aby sme predišli neočakávanému správaniu.
def iba_cisla(meno_suboru): """ Vráti zoznam celých čísel z daného súboru. Ak sa súbor nedá otvoriť, vráti prázdny zoznam. """ try: with open(meno_suboru, 'r') as subor: cisla = [] for riadok in subor: try: cislo = int(riadok.strip()) cisla.append(cislo) except ValueError: # Ignorujeme riadky, ktoré nie sú číslami pass return cisla except FileNotFoundError: return []# Príklad použitiazoznam_cisiel = iba_cisla("cisla.txt")print(zoznam_cisiel)V tomto príklade, ak sa súbor s daným menom nenájde, vyvolá sa výnimka FileNotFoundError, ktorá je zachytená a funkcia vráti prázdny zoznam. Ak sa v súbore nachádzajú riadky, ktoré nie sú číslami, vyvolá sa výnimka ValueError, ktorá je zachytená a riadok je ignorovaný.
Vlastné výnimky a príkaz assert
Okrem štandardných výnimiek v Pythone si môžeme definovať aj vlastné typy výnimiek. To sa robí vytvorením novej triedy, ktorá je odvodená od základnej triedy Exception.
class ZlyVstup(Exception): passdef over_vek(vek): if vek < 0: raise ZlyVstup("Vek nemôže byť záporný.") return vektry: vek = over_vek(-5)except ZlyVstup as e: print(e)Príkaz assert slúži na kontrolu podmienok v kóde. Ak podmienka nie je splnená, vyvolá sa výnimka AssertionError. Používa sa na ladenie a zabezpečenie toho, že kód sa správa správne.
def rgb(r, g, b): assert 0 <= r <= 255, "Červená zložka musí byť v rozsahu 0-255" assert 0 <= g <= 255, "Zelená zložka musí byť v rozsahu 0-255" assert 0 <= b <= 255, "Modrá zložka musí byť v rozsahu 0-255" return f'#{r:02x}{g:02x}{b:02x}'
Hľadanie v dátových štruktúrach a vyvolávanie výnimiek
Metóda index() v zozname vyvoláva výnimku ValueError, ak sa hľadaná hodnota v zozname nenachádza. Túto funkcionalitu môžeme použiť aj v našich vlastných funkciách.
def hladaj(zoznam, hodnota): """ Hľadá prvý výskyt danej hodnoty v dvojrozmernom zozname. Ak sa hodnota nenachádza, vyvolá výnimku ValueError. """ for i, riadok in enumerate(zoznam): try: j = riadok.index(hodnota) return i, j except ValueError: pass raise ValueError("hodnota is not in list")# Príklad použitiazoznam = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]try: riadok, stlpec = hladaj(zoznam, 5) print(f"Hodnota 5 sa nachádza na riadku {riadok} a v stĺpci {stlpec}")except ValueError as e: print(e)Dopad neplatnosti (invalidity) v právnom kontexte
Koncept "invalidity" sa neobmedzuje len na programovanie. Je kľúčový aj v právnom prostredí, kde môže mať závažné dôsledky. Rozhodnutie súdu členského štátu A, týkajúce sa zápisu vlastníckeho práva k obchodným podielom v obchodnej spoločnosti so sídlom v členskom štáte A, podľa ktorého má byť prevod týchto obchodných podielov považovaný za neplatný z dôvodu, že súd členského štátu A neuznáva právomoci správcu konkurznej podstaty z členského štátu B v rámci konkurzného konania vykonaného a ukončeného v členskom štáte B, je príkladom výnimky uvedenej v článku 1 ods. 2 písm. b) nariadenia Rady (ES) č. 44/2001 z 22. decembra 2000 o právomoci a o uznávaní a výkone rozsudkov v občianskych a obchodných veciach. Takáto neplatnosť prevodu akcií môže mať zásadný vplyv na vlastnícke práva a stabilitu podniku.

Ďalšie príklady neplatnosti v právnych predpisoch Európskej únie zahŕňajú:
- Neplatnosť nariadenia Komisie (ES) č. 729/2004 z 15. apríla 2004 o zatrieďovaní niektorých tovarov do kombinovanej nomenklatúry v znení vyplývajúcom z korigenda uverejneného 7. mája 2004 v časti, v ktorej prostredníctvom korigenda došlo k rozšíreniu pôsobnosti pôvodného nariadenia na chodúľky a zatrieďuje ich do podpoložky 8716 80 00 kombinovanej nomenklatúry.
- Neplatnosť nariadenia Rady (ES) č. 1355/2008 z 18. decembra 2008, ktorým sa ukladá konečné antidumpingové clo a s konečnou platnosťou vyberá dočasné clo uložené na dovoz určitých upravených alebo konzervovaných citrusových plodov (najmä mandarínok atď.) s pôvodom v Čínskej ľudovej republike.
- Otázka, či je článok 3 nariadenia Komisie č. 530/2008 neplatný kvôli porušeniu zásady proporcionality v rozsahu, v akom obmedzuje činnosti vykládky alebo umiestňovania do klietok tuniakov na výkrm alebo chov, a to aj pri tuniakoch ulovených skôr a v súlade s nariadením Komisie č. 530/2008.
- Neplatnosť nariadenia Rady č. 2398/97/ES z 28. novembra 1997, ktorým sa ukladá konečné antidumpingové clo na dovoz posteľnej bielizne z bavlny s pôvodom v Egypte, Indii a Pakistane, z dôvodu neuvedenia použitia nulovej hodnoty pri výpočte priemerného dumpingového rozpätia v odôvodneniach.
- Neplatnosť odsekov (1) a (2) článku 4 nariadenia Komisie (ES) č. 1423/95 z 23. júna 1995, ktorým sa stanovujú vykonávacie pravidlá pre dovoz výrobkov v sektore cukru okrem melasy, v rozsahu, v akom stanovuje, že dodatočné clo je v zásade určené na základe reprezentatívnej ceny, a že toto clo má byť určené na základe dovoznej ceny CIF príslušnej zásielky iba vtedy, ak o to dovozca požiada.
- Otázka, či je článok 4 nariadenia (ES) č. 717/2007 (v spojení s článkami 2 písm. a) a 6 ods. 3) neplatný z toho dôvodu, že zavedenie cenového stropu pre maloobchodné poplatky za roaming porušuje zásadu proporcionality a/alebo subsidiarity.
- Neplatnosť postupu pri zúčtovaní výdavkov z dôvodu porušenia procesných náležitosti stanovených v článku 8 ods. 1 nariadenia (ES) č. 1663/95 (1) a týkajúcich sa dvojstranných rokovaní o úpravách, ktoré sa majú uplatňovať v oblasti vývozných náhrad na cukor zahrnutom medzi výrobkami, ktoré nie sú uvedené v prílohe I.
Dôležitosť správneho overovania a spracovania chýb
Pri vytváraní účtu v Interactive Brokers (IB) je nevyhnutné, aby systém správne overoval všetky vstupy, ako sú osobné informácie, daňové identifikačné číslo a skúsenosti s finančnými nástrojmi. Akýkoľkoľvek chybný alebo neplatný vstup môže viesť k neplatnosti celého procesu registrácie alebo k nesprávnemu nastaveniu účtu, čo by mohlo mať finančné a právne dôsledky. Použitie princípov spracovania výnimiek a overovania vstupov, podobne ako v Pythone, je v takýchto reálnych aplikáciách kľúčové pre zabezpečenie spoľahlivosti a integrity údajov.