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.