V tomto tutoriáli sa dozvieme o polymorfizme, rôznych druhoch polymorfizmu a o tom, ako ich môžeme pomocou príkladov implementovať v Pythone.
Čo je to polymorfizmus?
Doslovný význam polymorfizmu je podmienka výskytu v rôznych formách.
Polymorfizmus je veľmi dôležitý pojem v programovaní. Vzťahuje sa na použitie jediného typu entity (metóda, operátor alebo objekt) na reprezentáciu rôznych typov v rôznych scenároch.
Uveďme si príklad:
Príklad 1: Polymorfizmus v operátore sčítania
Vieme, že +
operátor sa vo veľkej miere používa v programoch Python. Ale nemá jediné použitie.
Pre celočíselné dátové typy sa +
operátor používa na vykonávanie operácie aritmetického sčítania.
num1 = 1 num2 = 2 print(num1+num2)
Vyššie uvedený program teda výstupy 3.
Podobne pre dátové typy reťazcov sa +
operátor používa na vykonávanie zreťazenia.
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
Výsledkom je, že vyššie uvedený program vydáva programovanie v jazyku Python.
Tu vidíme, že +
na vykonávanie rôznych operácií pre odlišné dátové typy sa použil jeden operátor . Toto je jeden z najjednoduchších výskytov polymorfizmu v Pythone.
Funkčný polymorfizmus v Pythone
V Pythone sú niektoré funkcie, ktoré sú kompatibilné na spustenie s viacerými dátovými typmi.
Jednou z takýchto funkcií je len()
funkcia. Môže bežať s mnohými dátovými typmi v Pythone. Pozrime sa na niekoľko príkladov použitia tejto funkcie.
Príklad 2: Polymorfná funkcia len ()
print(len("Programiz")) print(len(("Python", "Java", "C"))) print(len(("Name": "John", "Address": "Nepal")))
Výkon
9 3 2
Tu vidíme, že s touto len()
funkciou môže pracovať veľa dátových typov, ako sú reťazec, zoznam, n-tica, množina a slovník . Vidíme však, že vracia konkrétne informácie o konkrétnych dátových typoch.

Polymorfizmus triedy v Pythone
Polymorfizmus je veľmi dôležitý pojem v objektovo orientovanom programovaní.
Ak sa chcete dozvedieť viac o OOP v Pythone, navštívte: Objektovo orientované programovanie v jazyku Python
Koncept polymorfizmu môžeme použiť pri vytváraní metód tried, pretože Python umožňuje rôznym triedam mať metódy s rovnakým názvom.
Potom môžeme zovšeobecniť volanie týchto metód ignorovaním objektu, s ktorým pracujeme. Pozrime sa na príklad:
Príklad 3: Polymorfizmus v triedových metódach
class Cat: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"I am a cat. My name is (self.name). I am (self.age) years old.") def make_sound(self): print("Meow") class Dog: def __init__(self, name, age): self.name = name self.age = age def info(self): print(f"I am a dog. My name is (self.name). I am (self.age) years old.") def make_sound(self): print("Bark") cat1 = Cat("Kitty", 2.5) dog1 = Dog("Fluffy", 4) for animal in (cat1, dog1): animal.make_sound() animal.info() animal.make_sound()
Výkon
Mňau som mačka. Volám sa Kitty. Mam 2,5 roka. Mňau Bark Som pes. Moje meno je Fluffy. Mam 4 roky. Štekať
Tu sme vytvorili dve triedy Cat
a Dog
. Zdieľajú podobnú štruktúru a majú rovnaké názvy metód info()
a make_sound()
.
Všimnite si však, že sme nevytvorili spoločnú nadtriedu ani sme triedy nijako neprepojili. Aj potom môžeme tieto dva rôzne objekty zbaliť do n-tice a iterovať cez ňu pomocou bežnej živočíšnej premennej. Je to možné kvôli polymorfizmu.
Polymorfizmus a dedičnosť
Rovnako ako v iných programovacích jazykoch, aj podradené triedy v Pythone dedia metódy a atribúty z rodičovskej triedy. Môžeme predefinovať určité metódy a atribúty špeciálne tak, aby vyhovovali podradenej triede, ktorá je známa ako Prepísanie metódy .
Polymorfizmus nám umožňuje prístup k týmto prepísaným metódam a atribútom, ktoré majú rovnaký názov ako nadradená trieda.
Pozrime sa na príklad:
Príklad 4: Prepísanie metódy
from math import pi class Shape: def __init__(self, name): self.name = name def area(self): pass def fact(self): return "I am a two-dimensional shape." def __str__(self): return self.name class Square(Shape): def __init__(self, length): super().__init__("Square") self.length = length def area(self): return self.length**2 def fact(self): return "Squares have each angle equal to 90 degrees." class Circle(Shape): def __init__(self, radius): super().__init__("Circle") self.radius = radius def area(self): return pi*self.radius**2 a = Square(4) b = Circle(7) print(b) print(b.fact()) print(a.fact()) print(b.area())
Výkon
Kruh som dvojrozmerný tvar. Štvorce majú každý uhol rovný 90 stupňom. 153,93804002589985
Tu vidíme, že metódy ako napríklad __str__()
, ktoré neboli prepísané v podradených triedach, sa používajú z nadradenej triedy.
Kvôli polymorfizmu tlmočník Pythonu automaticky rozpozná, že fact()
metóda pre objekt a
(trieda Square) je prepísaná. Používa teda ten, ktorý je definovaný v podradenej triede.
Na druhej strane, pretože fact()
metóda pre objekt b nie je prepísaná, používa sa z triedy Parent Shape.

Poznámka : Preťaženie metód , spôsob vytvárania viacerých metód s rovnakým názvom, ale rôznymi argumentmi, nie je v Pythone možný.