7 min lexim
Polimorfizmi
Një udhëzim, shumë forma
Fjala polimorfizëm do të thotë "shumë forma". Në programim ajo përshkruan një ide të vogël por të fuqishme: i njëjti udhëzim mund të bëjë gjënë e duhur për lloje të ndryshme objektesh. E pe një shenjë të saj te mbishkrimi, ku një klasë fëmijë jep versionin e vet të një metode të prindit. Polimorfizmi është ajo që kjo të lejon të bësh më tej: të thërrasësh një emër metode mbi një grumbull të përzier objektesh dhe të lësh çdo objekt të përgjigjet në mënyrën e vet.
Fitimi është kod që s'ka nevojë të pyesë "çfarë je saktësisht?" para se të veprojë. Ai thjesht kërkon sjelljen dhe i beson çdo objekti ta japë atë.
Forma të ndryshme, një emër metode
Le të themi se ke disa forma gjeometrike dhe do sipërfaqen e secilës. Jepi çdo klase forme një metodë të quajtur siperfaqja, por lëre secilën ta llogaritë saktë për llojin e vet.
import math
class Drejtkendesh:
def __init__(self, gjeresia, lartesia):
self.gjeresia = gjeresia
self.lartesia = lartesia
def siperfaqja(self):
return self.gjeresia * self.lartesia
class Rreth:
def __init__(self, rrezja):
self.rrezja = rrezja
def siperfaqja(self):
return math.pi * self.rrezja ** 2
class Trekendesh:
def __init__(self, baza, lartesia):
self.baza = baza
self.lartesia = lartesia
def siperfaqja(self):
return 0.5 * self.baza * self.lartesia
Tri formula pa lidhje mes tyre, por një emër metode i përbashkët. Ai emër i përbashkët është krejt marifeti.
Kod që s'e vret mendjen se cilën formë mban
Meqë çdo formë i përgjigjet siperfaqja, një cikël i vetëm mund t'i trajtojë të gjitha në një listë të përzier. Cikli nuk e kontrollon kurrë llojin; ai thjesht thërret metodën dhe lë çdo objekt të përgjigjet.
format = [Drejtkendesh(3, 4), Rreth(5), Trekendesh(6, 2)]
for forma in format:
print(round(forma.siperfaqja(), 2))
# 12
# 78.54
# 6.0
Nëse nesër shton një klasë Katror me siperfaqja të vetën, ky cikël vazhdon të punojë i paprekur. Kjo është dhurata e vërtetë e polimorfizmit: kodi që përdor objektet nuk rritet e nuk ndryshon kur shton lloje të reja. E shkruan ciklin një herë, dhe çdo formë e sjellshme futet brenda tij.
Këshillë
Python nuk kërkon që format të ndajnë një prind që kjo të punojë. Ai thjesht thërret siperfaqja dhe pret një përgjigje, një qasje që shpesh quhet duck typing: nëse i përgjigjet siperfaqja si një formë, trajtohet si formë. Marrëveshja është emri i metodës, jo pema familjare.
E ke parë tashmë
Polimorfizmi s'është vetëm diçka që ndërton ti; Python mbështetet te ai kudo. Funksioni len jep numrin e shkronjave në një varg, numrin e njësive në një listë, dhe numrin e çelësave në një fjalor. Një emër, dhe çdo lloj përgjigjet me kuptim për atë që është. Shenja + mbledh dy numra, por bashkon dy vargje fund më fund. Çdo herë, i njëjti udhëzim merr një formë të përshtatur me objektin që takon, që është pikërisht modeli që ndjekin format e tua.
Do ta shohësh të shpjeguar? Ja leksioni i regjistruar i Code for Albania për këtë temë.
Provoje tani
Shto një klasë Katror me metodën e vet siperfaqja te tri format sipër, pastaj fut një Katror te lista format dhe ekzekuto të njëjtin cikël pa e ndryshuar. Verifiko se shtyp katër sipërfaqe pa e prekur ciklin. Kjo është polimorfizmi që jep fryt: lloj i ri, i njëjti kod.
Provo veten
- Me fjalët e tua, çfarë i lejon polimorfizmi një cikli të vetëm të bëjë që përndryshe nuk do të mundej, dhe pse ka rëndësi kjo kur më vonë shton një lloj të ri objekti?
- Tri klasat e formave nuk janë të lidhura me trashëgimi, prapëseprapë cikli mbi to punon. Cila është gjëja e vetme që duhet të kenë të përbashkët që kjo të ndodhë?
- Jep një shembull të përditshëm nga vetë Python, jashtë formave, ku i njëjti udhëzim sillet ndryshe në varësi të llojit të objektit që i jepet.
Nga vjen ky mësim
Ndërtuar mbi
- Data Structures and Algorithms
Kurset e alphaPlan ndërtohen mbi programe të zhvilluara në klasë, e nuk shpiken për web-in. Kur një pohim mbështetet mbi një standard të jashtëm ose mbi një rast të raportuar, ai emërtohet më sipër që ta kontrollosh vetë e të mos na besosh në fjalë.
Ky kurs u zhvillua nga alphaPlan Center mbi bazën e programeve të realizuara në partneritet me rrjetin American Corners.
Gjete diçka të paqartë, të vjetruar ose që mund të përmirësohet? Sugjero një përmirësim