
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 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.
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). To umožňuje preťažovanie operátorov, teda definovanie nového významu pre existujúce operácie pre vlastné triedy.
Používateľ uviedol príklad s triedou Cas, kde sa preťažuje operátor + (sčítanie) pre sčítanie dvoch objektov triedy Cas.
Prečítajte si tiež: Praktické aspekty bezpečnosti hesiel
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.
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. Zachytávanie všetkých výnimiek naraz (except:) sa neodporúča, pretože môže skryť skutočné problémy v kóde.
Pri práci so súbormi je spracovanie výnimiek obzvlášť dôležité, pretože môže nastať mnoho chýb, napríklad súbor neexistuje, nemá správny formát alebo je poškodený.
Prečítajte si tiež: Riešenie problémov s neplatným vstupom
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ý.
assertOkrem š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}'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)Používateľ poskytol rozsiahle informácie o procese vytvárania účtu v Interactive Brokers (IB). Hoci táto téma priamo nesúvisí s polymorfizmom a výnimkami, ilustruje dôležitosť spracovania chýb a overovania vstupov v reálnych aplikáciách. Registračný formulár IB vyžaduje zadanie rôznych údajov, ako sú osobné informácie, daňové identifikačné číslo a skúsenosti s finančnými nástrojmi. Nesprávne zadanie týchto údajov môže viesť k zamietnutiu registrácie.
Prečítajte si tiež: Podmienky pre prepočet invalidného dôchodku
Pri vytváraní aplikácie, ktorá by automatizovala proces registrácie v IB, by bolo nevyhnutné použiť rozsiahle spracovanie výnimiek na overenie vstupov a zabezpečenie toho, že všetky povinné polia sú vyplnené správne.
Používateľ uviedol rozsiahle informácie o aplikácii OPC Monitor.