V tej vadnici bomo spoznali polimorfizem, različne vrste polimorfizmov in kako jih lahko uporabimo v Pythonu s pomočjo primerov.
Kaj je polimorfizem?
Dobesedni pomen polimorfizma je pogoj pojavljanja v različnih oblikah.
Polimorfizem je zelo pomemben pojem pri programiranju. Nanaša se na uporabo enotipske entitete (metode, operaterja ali predmeta) za zastopanje različnih tipov v različnih scenarijih.
Vzemimo primer:
Primer 1: Operater polimorfizma v seštevanju
Vemo, da se +
operater pogosto uporablja v programih Python. Vendar nima ene same uporabe.
Pri celoštevilnih podatkovnih vrstah se +
operater uporablja za izvajanje aritmetičnega seštevanja.
num1 = 1 num2 = 2 print(num1+num2)
Zato zgornji program odda 3.
Podobno se za tipe podatkovnih nizov +
operator uporablja za združevanje.
str1 = "Python" str2 = "Programming" print(str1+" "+str2)
Kot rezultat, zgornji program izpiše programiranje Python.
Tu lahko vidimo, da je bil en operater +
uporabljen za izvajanje različnih operacij za različne tipe podatkov. To je eden najpreprostejših pojavov polimorfizma v Pythonu.
Funkcija Polimorfizem v Pythonu
V Pythonu je nekaj funkcij, ki so združljive za izvajanje z več vrstami podatkov.
Ena takih funkcij je len()
funkcija. V Pythonu lahko deluje z različnimi vrstami podatkov. Oglejmo si nekaj primerov uporabe funkcije.
Primer 2: Polimorfna funkcija len ()
print(len("Programiz")) print(len(("Python", "Java", "C"))) print(len(("Name": "John", "Address": "Nepal")))
Izhod
9 3 2
Tu lahko vidimo, da lahko s len()
funkcijo deluje veliko vrst podatkov, kot so niz, seznam, nabor, nabor in slovar . Vendar lahko vidimo, da vrne posebne informacije o določenih vrstah podatkov.

Razred polimorfizem v Pythonu
Polimorfizem je zelo pomemben koncept v objektno usmerjenem programiranju.
Če želite izvedeti več o OOP v Pythonu, obiščite: Python objektno usmerjeno programiranje
Koncept polimorfizma lahko uporabimo pri ustvarjanju metod razredov, saj Python različnim razredom omogoča metode z istim imenom.
Nato lahko te metode pozneje posplošimo tako, da ne upoštevamo predmeta, s katerim delamo. Oglejmo si primer:
Primer 3: Polimorfizem v razrednih metodah
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()
Izhod
Meow sem mačka. Moje ime je Kitty. Stara sem 2,5 leta. Meow Bark Sem pes. Moje ime je Fluffy. Stara sem 4 leta. Lubje
Tu smo ustvarili dva razreda Cat
in Dog
. Imajo podobno strukturo in imajo enaka imena metod info()
in make_sound()
.
Upoštevajte pa, da nismo ustvarili skupnega superrazreda ali na kakršen koli način povezali razredov. Že takrat lahko ta dva različna predmeta spakiramo v zavoj in skozi njega preletimo s skupno spremenljivko živali. Možno je zaradi polimorfizma.
Polimorfizem in dedovanje
Tako kot v drugih programskih jezikih tudi podrejeni razredi v Pythonu podedujejo metode in atribute iz nadrejenega razreda. Nekatere metode in atribute lahko ponovno definiramo posebej, da ustrezajo podrejenemu razredu, ki je znan kot Metoda preglasitve .
Polimorfizem nam omogoča dostop do teh razveljavljenih metod in atributov, ki imajo enako ime kot nadrejeni razred.
Oglejmo si primer:
Primer 4: Preglasitev metode
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())
Izhod
Krog I je dvodimenzionalna oblika. Kvadrati imajo vsak kot enak 90 stopinj. 153,93804002589985
Tu lahko vidimo, da se metode, kot npr. __str__()
, Ki niso bile razveljavljene v podrejenih razredih, uporabljajo iz nadrejenega razreda.
Zaradi polimorfizma tolmač Python samodejno prepozna, da je fact()
metoda za objekt a
(razred Square) razveljavljena. Torej, uporablja tisto, definirano v otroškem razredu.
Po drugi strani pa, ker fact()
metoda za objekt b ni razveljavljena, se uporablja iz razreda Nadrejena oblika.

Opomba : Preobremenitev metode , način za ustvarjanje več metod z istim imenom, vendar z različnimi argumenti, v Pythonu ni mogoča.