Krajta

Polymorfismus v Pythonu

Polymorfismus v Pythonu
Polymorfismus znamená „mnoho forem.„Polymorfismus je důležitou vlastností objektově orientovaného programování (OOP).  Když je stejná metoda deklarována vícekrát, pro více účelů a v různých třídách, pak se nazývá polymorfismus. Další vlastností OOP je dědictví, prostřednictvím kterého lze podřízenou třídu vytvořit zděděním funkcí nadřazené třídy. Někdy vyžaduje, aby programátor deklaroval metodu se stejným názvem v třídách rodičů i podřízených pro různé účely. Tento typ úlohy lze také implementovat pomocí polymorfismu. Tento článek vysvětluje, jak lze definovat polymorfismus v objektově orientovaném programování (OOP).

Příklad 1: Polymorfismus s funkcemi a objekty

Následující skript ukazuje použití polymorfismu mezi dvěma různými třídami. K vytvoření objektu těchto tříd se používá funkce. Hodnota pojmenované proměnné barva je inicializován v __init __ () metoda obouPapoušek„a“Pštros'třídy v době vytváření objektu. The funkce() metoda je definována v obou třídách, ale výstup metody pro každou třídu je trochu odlišný. The Create_Object () funkce se používá k vytvoření objektu třídy. Tato funkce se provede dvakrát za účelem vytvoření objektu vPapoušek‚třída a 'Pštros„třída. Každá zavolá metodu features () obou tříd a vytiskne výstup.

#!/ usr / bin / env python3
# Definujte třídu Papoušek
třída Papoušek ():
def __init __ (vlastní, barva):
já.barva = barva
def funkce (self):
print ("Barva papouška je% s"% self.barva)
tisk ("Papoušek může létat")
# Definujte pštrosí třídu
třída Pštros ():
def __init __ (vlastní, barva):
já.barva = barva
def funkce (self):
print ("Barva pštrosa je% s"% self.barva)
tisk („Pštros nemůže létat“)
# Definujte funkci pro volání metody třídy
def Create_Object (Object):
Objekt.funkce()
# Vytvořit objekt třídy Parrot
Create_Object (Parrot ('Green'))
# Vytvořte objekt třídy Pštros
Create_Object (Ostrich ('Black and White'))

Výstup

Následující výstup ukazuje, že objekt 'Papoušek‚třída je vytvořena pomocí 'Zelená„jako barva hodnota. Funkce vytiskne výstup voláním funkce() metoda 'Papoušek„třída. Dále je předmětemPštros'class is created with'Černý a bílý„jako barva hodnota. Funkce vytiskne výstup voláním funkce() metoda 'Pštros„třída.

Příklad 2: Polymorfismus v metodách nesouvisejících tříd

Stejně jako v předchozím příkladu ukazuje následující skript použití polymorfismu ve dvou různých třídách, ale k deklaraci objektu se nepoužívá žádná vlastní funkce. The __init __ () metoda obouManažer' a 'Úředník'třídy inicializují potřebné proměnné. Polymorfismus je zde implementován vytvořením post_details () a plat () metody uvnitř obou tříd. Obsah těchto metod je pro každou z těchto tříd odlišný. Dále jsou proměnné objektu vytvořeny pro obě třídy a iterovány pomocí a pro smyčka. V každé iteraci je post_details () a plat () metody jsou volány k tisku výstupu.

#!/ usr / bin / env python3
# Definujte třídu s názvem Manager
manažer třídy:
def __init __ (já, jméno, oddělení):
já.jméno = jméno
já.post = 'Manažer'
já.oddělení = oddělení
# Definujte funkci pro nastavení podrobností
def post_details (self):
pokud já.oddělení.upper () == 'HR':
já.základní = 30000
jiný:
já.základní = 25 000
já.houseRent = 10 000
já.doprava = 5000
print ("Příspěvek% s je% s"% (vlastní.jméno, já.pošta))
# Definujte funkci pro výpočet platu
def plat (self):
plat = já.základní + já.houseRent + já.doprava
návratový plat
# Definujte třídu s názvem Clerk
úředník třídy:
def __init __ (já, jméno):
já.jméno = jméno
já.post = 'Úředník'
# Definujte funkci pro nastavení podrobností
def post_details (self):
já.základní = 10 000
já.doprava = 2000
print ("Příspěvek% s je% s"% (vlastní.jméno, já.pošta))
# Definujte funkci pro výpočet platu
def plat (self):
plat = já.základní + já.doprava
návratový plat
# Vytvářejte objekty pro třídy
manager = Manager ("Kabir", "hr")
úředník = úředník („Robin“)
# Zavolejte stejné funkce z různých tříd
pro obj in (manažer, úředník):
obj.post_details ()
tisk („Plat je“, obj.plat ())

Výstup

Následující výstup ukazuje, že objekt 'ŽlabTřída se používá při první iteraci pro smyčka a po výpočtu se vytiskne plat manažera. Předmět 'ÚředníkTřída se používá při druhé iteraci pro smyčka a plat úředníka se po výpočtu vytiskne.

Příklad 3: Polymorfismus v metodách souvisejících tříd

Následující skript ukazuje použití polymorfismu mezi dvěma podřízenými třídami. Tady, oba 'Trojúhelník' a 'Kruh„jsou podřízené třídy nadřazené třídy s názvem“Geometric_Shape.„Podle dědičnosti má podřízená třída přístup ke všem proměnným a metodám nadřazené třídy. The __init __ () metoda 'Geometric_Shape'třída se používá v obou podřízených třídách k inicializaci proměnné název pomocí super () metoda. Hodnoty základna a výška z 'Trojúhelník'třída bude inicializována v době vytváření objektu. Stejným způsobem jsou hodnoty poloměruKruh'třída bude inicializována v době vytváření objektu. Vzorec pro výpočet plochy trojúhelníku je ½ × základna × výška, který je implementován v plocha() metoda 'Trojúhelník„třída. Vzorec pro výpočet plochy kruhu je 3.14 × (poloměr)2, který je implementován v plocha() metoda 'Kruh„třída. Názvy obou metod jsou zde stejné, ale účel je jiný. Dále bude od uživatele převzata řetězcová hodnota pro vytvoření objektu a pro volání metody založené na hodnotě. Pokud uživatel zadá „trojúhelník“, pak objekt „Trojúhelník' bude vytvořena třída, a pokud uživatel zadá „circle“, pak objekt 'Kruh' bude vytvořena třída. Pokud uživatel zadá text bez „trojúhelníku“ nebo „kruhu“, nebude vytvořen žádný objekt a vytiskne se chybová zpráva.

#!/ usr / bin / env python3
# Definujte nadřazenou třídu
třída Geometric_Shape:
def __init __ (já, jméno):
já.jméno = jméno
# Definujte podřízenou třídu pro výpočet plochy trojúhelníku
třída Triangle (Geometric_Shape):
def __init __ (já, jméno, základna, výška):
super ().__init __ (jméno)
já.základna = základna
já.výška = výška
def area (self):
výsledek = 0.5 * já.základna * já.výška
print ("\ nPlocha% s =% 5.2f "% (vlastní.jméno, výsledek))
# Definujte podřízenou třídu pro výpočet plochy kruhu
třída kruh (Geometric_Shape):
def __init __ (self, name, radius):
super ().__init __ (jméno)
já.poloměr = poloměr
def area (self):
výsledek = 3.14 * já.poloměr ** 2
print ("\ nOblast% s =% 5.2f "% (vlastní.jméno, výsledek))
cal_area = input ("Kterou plochu chcete vypočítat? trojúhelník / kruh \ n ")
pokud cal_area.upper () == 'TRIANGLE':
base = float (input ('Enter the base of the triangle:'))
height = float (vstup ('Zadejte výšku trojúhelníku:'))
obj = Triangle ('Triangle', base, height)
obj.plocha()
elif cal_area.upper () == 'CIRCLE':
radius = float (vstup ('Zadejte poloměr kruhu:'))
obj = Circle ('Circle', radius)
obj.plocha()
jiný:
tisk ("Chybný vstup")

Výstup

V následujícím výstupu je skript spuštěn dvakrát. Poprvé, trojúhelník je bráno jako vstup a objekt je inicializován třemi hodnotami, 'Trojúhelník'', základna, a výška. Tyto hodnoty se poté použijí k výpočtu plochy trojúhelníku a výstup se vytiskne. Podruhé, kruh je bráno jako vstup a objekt je inicializován dvěma hodnotami, 'Kruh' a poloměr. Tyto hodnoty se poté použijí k výpočtu plochy kruhu a výstup se vytiskne.

Závěr

Tento článek použil jednoduché příklady k vysvětlení tří různých použití polymorfismu v Pythonu. Koncept polymorfismu lze také použít bez tříd, což je metoda, která zde není vysvětlena. Tento článek pomohl čtenářům dozvědět se více o tom, jak aplikovat polymorfismus v objektově orientovaném programování v Pythonu.

Hry Jak používat AutoKey k automatizaci linuxových her
Jak používat AutoKey k automatizaci linuxových her
AutoKey je nástroj pro automatizaci stolních počítačů pro systémy Linux a X11, programovaný v programech Python 3, GTK a Qt. Pomocí jeho funkcí skript...
Hry Jak zobrazit počítadlo FPS v linuxových hrách
Jak zobrazit počítadlo FPS v linuxových hrách
Hraní na Linuxu získalo velký tlak, když společnost Valve v roce 2012 oznámila podporu systému Linux pro klienta Steam a jejich hry. Od té doby se mno...
Hry Jak stáhnout a přehrát Sid Meier's Civilization VI v systému Linux
Jak stáhnout a přehrát Sid Meier's Civilization VI v systému Linux
Úvod do hry Civilization 6 je moderní pojetí klasického konceptu představeného v sérii her Age of Empires. Myšlenka byla docela jednoduchá; začali bys...