8 min lexim
Atributet dhe metodat
Dy gjysmat e një objekti
Çdo objekt përbëhet nga dy lloje gjërash. Atributet janë të dhënat që mban, emrat: një balancë, një emër, një numër faqesh. Metodat janë veprimet që mund të bëjë, foljet: depozito, përshkruaj, shto interes. Një klasë është vërtet thjesht një vend për të mbajtur bashkë një grup atributesh dhe metodat që punojnë mbi to, që të mos ndahen kurrë.
Do të ndërtojmë hap pas hapi një llogari të thjeshtë kursimi për t'i parë të dyja, dhe për të takuar edhe një dallim që i ngatërron njerëzit: të dhënat që i takojnë një objekti të vetëm kundrejt të dhënave që i ndan çdo objekt i klasës.
Atributet e instancës: të dhënat e vetë një objekti
Një atribut instance i takon një objekti dhe vetëm një objekti. E vendos në __init__, duke përdorur self, dhe çdo objekt merr kopjen e vet.
class LlogariKursimi:
def __init__(self, zoteruesi, balanca):
self.zoteruesi = zoteruesi # zotëruesi i kësaj llogarie
self.balanca = balanca # balanca e kësaj llogarie
Nëse bën dy llogari, secila ka zotëruesin dhe balancën e vet. Ndryshimi i njërës e lë tjetrën të qetë, sepse self.balanca do të thotë gjithmonë "balanca e kësaj llogarie", jo ndonjë numër i përbotshëm.
Atributet e klasës: të dhëna të ndara nga të gjithë
Një atribut klase është ndryshe: i takon vetë klasës, ndaj çdo objekt sheh të njëjtën vlerë. Shkruhet drejt e brenda trupit të klasës, jo brenda __init__. Një përdorim i mirë është diçka që është vërtet e njëjtë për të gjitha objektet, si një normë interesi që banka e cakton për çdo llogari.
class LlogariKursimi:
norma_interesit = 0.03 # atribut klase: i ndarë nga të gjitha llogaritë
def __init__(self, zoteruesi, balanca):
self.zoteruesi = zoteruesi # atribut instance: unik për çdo llogari
self.balanca = balanca
Këtu zoteruesi dhe balanca ndryshojnë nga llogaria në llogari, por norma_interesit është një vlerë e ndarë nga të gjitha. Nëse banka e ngre normën te klasa, çdo llogari e pasqyron normën e re menjëherë. Kjo është shenja për të përdorur një atribut klase: kur vlera është veti e tërë llojit, jo e ndonjë objekti të vetëm.
Metodat, getter-at dhe setter-at
Metodat janë funksione të përcaktuara brenda klasës; parametri i tyre i parë është gjithmonë self, që të mund të lexojnë e të ndryshojnë atributet e atij objekti. Disa metoda thjesht raportojnë një vlerë, dhe disa e ndryshojnë atë në mënyrë të kontrolluar. Sipas konventës, një metodë që lexon një atribut është një getter, dhe një metodë që e përditëson një atribut është një setter.
class LlogariKursimi:
norma_interesit = 0.03
def __init__(self, zoteruesi, balanca):
self.zoteruesi = zoteruesi
self.balanca = balanca
def merr_balancen(self): # getter: thjesht raporton
return self.balanca
def depozito(self, shuma): # si setter: ndryshon, me një kontroll
if shuma > 0:
self.balanca = self.balanca + shuma
def shto_interes(self): # përdor atributin e ndarë të klasës
self.balanca = self.balanca + self.balanca * LlogariKursimi.norma_interesit
Tani llogaria mund të përdoret nëpërmjet metodave të veta në vend që të preket drejtpërdrejt te të dhënat.
llogari = LlogariKursimi("Fondi i shtëpisë", 1000)
llogari.depozito(500)
print(llogari.merr_balancen()) # 1500
llogari.depozito(-40) # refuzohet nga kontrolli, balanca s'ndryshon
print(llogari.merr_balancen()) # 1500
Këshillë
Arsyeja pse kalon nëpër depozito në vend që të shkruash me dorë llogari.balanca = llogari.balanca + 500 është rojtari brenda saj. Një setter mund të refuzojë hyrje të gabuar, si një depozitë negative, kështu që objekti mbron të dhënat e veta. Ai zakon është ai që i bën objektet të besueshme teksa një program rritet.
Atributet mbajnë gjendjen, metodat kontrollojnë si lexohet e ndryshohet ajo gjendje, dhe mbajtja e të dhënave të instancës veç nga të dhënat e ndara të klasës e lejon një projekt të vetëm t'u shërbejë pastër shumë objekteve. Hapi tjetër është të lësh një klasë të ndërtohet mbi një tjetër.
Do ta shohësh të shpjeguar? Ja leksioni i regjistruar i Code for Albania për këtë temë.
Provoje tani
Shkruaj një klasë Nxenes me një atribut klase shkolla të ndarë nga të gjithë nxënësit, atribute instance emri dhe piket të vendosura në __init__, dhe një metodë shto_pike(shuma) që shton vetëm kur shuma > 0. Bëj dy nxënës, shto pikë njërit, provo të shtosh një shumë negative, dhe shtyp totalet e pikëve të të dyve për ta parë rojtarin në punë.
Provo veten
- Shpjego ndryshimin mes një atributi instance dhe një atributi klase, dhe jep nga një shembull të secilit prej llogarisë së kursimit ku zgjedhja ka qartë kuptim.
- Pse është më e sigurt të thërrasësh
llogari.depozito(500)sesa të shkruash drejtpërdrejtllogari.balanca = llogari.balanca + 500? Çfarë mund të bëjë metoda që caktimi i thjeshtë nuk mundet? - Nëse banka e ndryshon
norma_interesitte klasa pasi disa llogari ekzistojnë tashmë, cilat prej atyre llogarive preken, dhe pse?
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