Polymorfismus v Pythonu (s příklady)

V tomto tutoriálu se dozvíme o polymorfismu, různých typech polymorfismu a o tom, jak je můžeme pomocí příkladů implementovat v Pythonu.

Co je polymorfismus?

Doslovný význam polymorfismu je podmínkou výskytu v různých formách.

Polymorfismus je v programování velmi důležitým konceptem. Odkazuje na použití entity jednoho typu (metoda, operátor nebo objekt) k reprezentaci různých typů v různých scénářích.

Vezměme si příklad:

Příklad 1: Polymorfismus v operátoru sčítání

Víme, že +operátor je široce používán v programech Pythonu. Ale nemá jediné použití.

U celočíselných datových typů se +operátor používá k provedení operace aritmetického přidání.

 num1 = 1 num2 = 2 print(num1+num2) 

Výše uvedený program tedy vydává 3.

Podobně pro datové typy řetězců se +operátor používá k provedení zřetězení.

 str1 = "Python" str2 = "Programming" print(str1+" "+str2) 

Výsledkem je, že výše uvedený program vydává programování v Pythonu.

Tady vidíme, že jeden operátor +byl použit k provedení různých operací pro odlišné datové typy. Toto je jeden z nejjednodušších výskytů polymorfismu v Pythonu.

Funkční polymorfismus v Pythonu

V Pythonu jsou některé funkce, které jsou kompatibilní pro provoz s více datovými typy.

Jednou z takových funkcí je len()funkce. Může běžet s mnoha datovými typy v Pythonu. Podívejme se na několik příkladů použití funkce.

Příklad 2: Polymorfní funkce len ()

 print(len("Programiz")) print(len(("Python", "Java", "C"))) print(len(("Name": "John", "Address": "Nepal"))) 

Výstup

 9 3 2 

Tady vidíme, že s touto len()funkcí může pracovat mnoho datových typů, jako je řetězec, seznam, n-tice, sada a slovník . Vidíme však, že vrací konkrétní informace o konkrétních datových typech.

Polymorfismus ve funkci len () v Pythonu

Polymorfismus třídy v Pythonu

Polymorfismus je velmi důležitý koncept v objektově orientovaném programování.

Další informace o OOP v Pythonu najdete na: Objektově orientované programování v Pythonu

Při vytváření třídních metod můžeme použít koncept polymorfismu, protože Python umožňuje různým třídám mít metody se stejným názvem.

Pak můžeme později zobecnit volání těchto metod ignorováním objektu, se kterým pracujeme. Podívejme se na příklad:

Příklad 3: Polymorfismus ve třídních metodách

 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ýstup

Mňau jsem kočka. Jmenuji se Kitty. Je mi 2,5 roku Meow Bark Jsem pes. Jmenuji se Fluffy. Mám 4 roky. Kůra

Zde jsme vytvořili dvě třídy Cata Dog. Sdílejí podobnou strukturu a mají stejné názvy metod info()a make_sound().

Všimněte si však, že jsme nevytvořili společnou nadtřídu ani jsme třídy nijak nespojovali. Dokonce i poté můžeme tyto dva různé objekty zabalit do n-tice a iterovat ji pomocí společné zvířecí proměnné. Je to možné kvůli polymorfismu.

Polymorfismus a dědičnost

Stejně jako v jiných programovacích jazycích, podřízené třídy v Pythonu také dědí metody a atributy z nadřazené třídy. Můžeme předefinovat určité metody a atributy konkrétně, aby se vešly do podřízené třídy, která se nazývá Přepsání metody .

Polymorfismus nám umožňuje přístup k těmto přepsaným metodám a atributům, které mají stejný název jako nadřazená třída.

Podívejme se na příklad:

Příklad 4: Přepsání metody

 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ýstup

Kruh jsem dvojrozměrný tvar. Čtverce mají každý úhel rovný 90 stupňům. 153.93804002589985

Zde vidíme, že metody jako __str__(), které nebyly přepsány v podřízených třídách, se používají z nadřazené třídy.

Kvůli polymorfismu překladač Pythonu automaticky rozpozná, že je přepsána fact()metoda pro objekt a(třída Square). Používá tedy ten, který je definován v podřízené třídě.

Na druhou stranu, protože fact()metoda pro objekt b není přepsána, používá se z třídy nadřazeného tvaru.

Polymorfismus ve třídách rodičů a dětí v Pythonu

Poznámka : Přetížení metody , způsob, jak vytvořit více metod se stejným názvem, ale různými argumenty, není v Pythonu možné.

Zajímavé články...