„Python“

Polimorfizmas „Python“

Polimorfizmas „Python“
Polimorfizmas reiškia „daugybė formų.„Polimorfizmas yra svarbus į objektą orientuoto programavimo (OOP) bruožas.  Kai tas pats metodas yra deklaruojamas kelis kartus, keliems tikslams ir skirtingoms klasėms, tada jis vadinamas polimorfizmu. Kitas OOP bruožas yra paveldėjimas, per kurį galima sukurti vaikų klasę paveldint tėvų klasės bruožus. Kartais programuotojui reikia deklaruoti to paties pavadinimo metodą tiek tėvų, tiek vaikų klasėse įvairiais tikslais. Šio tipo užduotis taip pat galima įgyvendinti naudojant polimorfizmą. Šiame straipsnyje paaiškinama, kaip polimorfizmą galima apibrėžti objektuose (OOP).

1 pavyzdys: polimorfizmas su funkcijomis ir objektais

Šis scenarijus parodo polimorfizmo naudojimą tarp dviejų skirtingų klasių. Funkcija naudojama kuriant tų klasių objektą. Įvardyto kintamojo vertė spalva yra inicializuotas __init __ () metodas tiekPapūga' ir 'Strutis'klasės objektų kūrimo metu. The funkcijos() metodas yra apibrėžtas abiejose klasėse, tačiau metodo rezultatas kiekvienai klasei yra šiek tiek kitoks. The Sukurti_objektą () funkcija naudojama kuriant klasės objektą. Ši funkcija vykdoma du kartus, norint sukurti objektą 'Papūga„klasėje ir“Strutis' klasė. Kiekvienas iškvies abiejų klasių funkciją () ir atspausdins išvestį.

#!/ usr / bin / env python3
# Apibrėžkite papūgos klasę
klasė Papūga ():
def __init __ (savaime, spalva):
savarankiškai.spalva = spalva
def savybės (savęs):
spausdinti ("Papūgos spalva yra% s"%.spalva)
spausdinti („Papūga gali skristi“)
# Apibrėžkite stručių klasę
stručių klasė ():
def __init __ (savaime, spalva):
savarankiškai.spalva = spalva
def savybės (savęs):
spausdinti ("Stručio spalva yra% s"%.spalva)
spausdinti („Strausas negali skristi“)
# Apibrėžkite funkciją, norėdami iškviesti klasės metodą
def Sukurti_objektą (objektą):
Objektas.funkcijos()
# Sukurkite Papūga klasės objektą
Create_Object (papūga ('žalia'))
# Sukurti stručių klasės objektą
Create_Object (strutis ('juoda ir balta'))

Rezultatas

Šis išvestis rodo, kad 'Papūga„klasė sukurta“Žaliaskaip spalva vertė. Funkcija atspausdina išvestį iškviesdama funkcijos() metodasPapūga' klasė. Toliau „Strutis„klasė sukurta“Juoda ir baltakaip spalva vertė. Funkcija atspausdina išvestį iškviesdama funkcijos() metodasStrutis' klasė.

2 pavyzdys: nesusijusių klasių metodų polimorfizmas

Kaip ir ankstesniame pavyzdyje, šiame scenarijuje parodytas polimorfizmo naudojimas dviejose skirtingose ​​klasėse, tačiau objektui deklaruoti nenaudojama jokia pasirinktinė funkcija. The __init __ () metodas tiekVadybininkas„ir“Raštininkas'klasės inicijuos reikiamus kintamuosius. Polimorfizmas čia įgyvendinamas kuriant post_details () ir atlyginimas () metodus abiejų klasių viduje. Šių metodų turinys kiekvienai iš šių klasių yra skirtingas. Tada objektų kintamieji sukuriami abiem klasėms ir kartojami a dėl kilpa. Kiekvienoje iteracijoje post_details () ir atlyginimas () metodai yra kviečiami atspausdinti išvestį.

#!/ usr / bin / env python3
# Apibrėžkite klasę pavadinimu „Vadybininkas“
klasės vadovas:
def __init __ (savastis, vardas, skyrius):
savarankiškai.vardas = vardas
savarankiškai.post = 'Vadovas'
savarankiškai.skyrius = skyrius
# Apibrėžkite funkciją, kad nustatytumėte išsamią informaciją
def post_details (self):
jei pats.skyrius.viršutinė () == 'HR':
savarankiškai.pagrindinis = 30000
Kitas:
savarankiškai.pagrindinis = 25000
savarankiškai.houseRent = 10000
savarankiškai.transportas = 5000
spausdinti ("% s žinutė yra% s"% (sav.vardas, savastis.paštu))
# Apibrėžkite algos apskaičiavimo funkciją
def atlyginimas (pats):
atlyginimas = savęs.pagrindinis + savęs.houseRent + self.transportas
grąžinimo atlyginimas
# Apibrėžkite klasę pavadinimu Clerk
klasės tarnautojas:
def __init __ (savęs, vardo):
savarankiškai.vardas = vardas
savarankiškai.post = 'Tarnautojas'
# Apibrėžkite funkciją, kad nustatytumėte išsamią informaciją
def post_details (self):
savarankiškai.pagrindinis = 10000
savarankiškai.transportas = 2000
spausdinti ("% s žinutė yra% s"% (sav.vardas, savastis.paštu))
# Apibrėžkite algos apskaičiavimo funkciją
def atlyginimas (pats):
atlyginimas = savęs.pagrindinis + savęs.transportas
grąžinimo atlyginimas
# Kurkite objektus klasėms
vadybininkas = vadybininkas („Kabir“, „hr“)
tarnautojas = tarnautojas („Robinas“)
# Iškvieskite tas pačias skirtingų klasių funkcijas
už obj (vadovas, tarnautojas):
obj.post_details ()
spausdinti („Atlyginimas yra“, obj.atlyginimas ())

Rezultatas

Šis išvestis rodo, kad 'Šešėlis"klasė naudojama pirmoje dėl kilpa ir vadovo atlyginimas atspausdinamas paskaičiavus. ObjektasRaštininkas"klasė naudojama antroje dėl kilpa ir tarnautojo atlyginimas atspausdinamas paskaičiavus.

3 pavyzdys: polimorfizmas susijusių klasių metoduose

Šis scenarijus parodo polimorfizmo naudojimą tarp dviejų vaikų klasių. Čia abuTrikampis„ir“Apskritimas"yra tėvų klasės vaikų klasės, pavadintos"Geometric_Shape.„Pagal paveldėjimą vaikų klasė gali naudotis visais tėvų klasės kintamaisiais ir metodais. The __init __ () metodasGeometric_Shape'klasė naudojama abiem vaikų klasėms kintamajam inicializuoti vardas naudojant super () metodas. Vertybės bazė ir ūgio iš 'Trikampis'klasė bus inicializuota objekto kūrimo metu. Tuo pačiu būdu spindulio vertėsApskritimas'klasė bus inicializuota objekto kūrimo metu. Trikampio ploto apskaičiavimo formulė yra ½ × bazė × ūgio, kuris įgyvendinamas plotas () metodasTrikampis' klasė. Apskritimo ploto apskaičiavimo formulė yra 3.14 × (spindulys)2, kuris įgyvendinamas plotas () metodasApskritimas' klasė. Abiejų metodų pavadinimai čia yra vienodi, tačiau paskirtis kitokia. Tada iš vartotojo bus paimta eilutės reikšmė objektui sukurti ir metodui iškviesti pagal vertę. Jei vartotojas įveda „trikampį“, tada „Trikampis “ klasė bus sukurta, o jei vartotojas įveda „apskritimą“, tada - „Ratas“ bus sukurta klasė. Jei vartotojas įveda bet kokį tekstą be „trikampio“ ar „apskritimo“, tada objektas nebus sukurtas ir bus išspausdintas klaidos pranešimas.

#!/ usr / bin / env python3
# Apibrėžkite tėvų klasę
klasė Geometric_Shape:
def __init __ (savęs, vardo):
savarankiškai.vardas = vardas
# Apibrėžkite vaikų klasę trikampio plotui apskaičiuoti
klasės trikampis (Geometric_Shape):
def __init __ (savęs, vardo, pagrindo, aukščio):
super ().__init __ (vardas)
savarankiškai.bazė = bazė
savarankiškai.aukštis = aukštis
def sritis (savarankiškai):
rezultatas = 0.5 * savęs.bazė * savastis.ūgio
spausdinti ("\ n% s sritis =% 5.2f "% (sav.vardas, rezultatas))
# Apibrėžkite vaikų klasę, kad būtų galima apskaičiuoti apskritimo plotą
klasės ratas (Geometric_Shape):
def __init __ (savęs, vardo, spindulio):
super ().__init __ (vardas)
savarankiškai.spindulys = spindulys
def sritis (savarankiškai):
rezultatas = 3.14 * savęs.spindulys ** 2
spausdinti ("\ n% s sritis =% 5.2f "% (sav.vardas, rezultatas))
cal_area = input ("Kurį plotą norite apskaičiuoti? trikampis / apskritimas \ n ")
jei cal_area.viršuje () == 'TRIKAMPIS':
base = float (input ('Įveskite trikampio pagrindą:'))
aukštis = plūdė (įvestis ('Įveskite trikampio aukštį:'))
obj = Trikampis („Trikampis“, pagrindas, aukštis)
obj.plotas ()
elif cal_area.viršuje () == 'RATAS':
spindulys = plūduriuojantis (įvestis ('Įveskite apskritimo spindulį:'))
obj = apskritimas ('apskritimas', spindulys)
obj.plotas ()
Kitas:
spausdinti („Neteisinga įvestis“)

Rezultatas

Šioje išvestyje scenarijus vykdomas du kartus. Pirmasis kartas, trikampis laikomas įvestimi, o objektas inicijuojamas pagal tris reikšmes "Trikampis", bazė, ir ūgio. Tada šios vertės naudojamos trikampio plotui apskaičiuoti, o išvestis bus atspausdinta. Antrą kartą, apskritimas laikomas įvestimi, o objektas inicijuojamas dviem reikšmėmis "Apskritimas"ir spindulys. Tada šios vertės naudojamos apskaičiuojant apskritimo plotą ir išvestis bus atspausdinta.

Išvada

Šiame straipsnyje buvo naudojami paprasti pavyzdžiai, paaiškinantys tris skirtingus „Python“ polimorfizmo naudojimo būdus. Polimorfizmo sąvoka taip pat gali būti taikoma be klasių - metodas, kuris čia nepaaiškinamas. Šis straipsnis padėjo skaitytojams sužinoti daugiau apie tai, kaip pritaikyti polimorfizmą į objektą orientuotame „Python“ programavime.

Kaip naudoti „AutoKey“, norint automatizuoti „Linux“ žaidimus
„AutoKey“ yra darbalaukio automatizavimo įrankis, skirtas „Linux“ ir „X11“, užprogramuotas „Python 3“, „GTK“ ir „Qt“. Naudodami scenarijų ir „MACRO“ f...
Kaip parodyti FPS skaitiklį „Linux“ žaidimuose
„Linux“ žaidimai gavo didelį postūmį, kai „Valve“ paskelbė „Linux“ palaikymą „Steam“ klientui ir jų žaidimams 2012 m. Nuo tada daugelis AAA ir indie ž...
Kaip atsisiųsti ir paleisti „Sid Meier Civilization VI“ sistemoje „Linux“
Įvadas į žaidimą „Civilization 6“ yra šiuolaikinė klasikinės koncepcijos, pristatytos „Age of Empires“ žaidimų serijoje, koncepcija. Idėja buvo gana p...