Kapseldamine¶
Kapseldamine (ingl k encapsulation) eraldab klassi funktsionaalse sisu ja liidese.
Kapseldamise saavutamiseks kirjeldatakse, millised klassid võivad objekti liikmeid kasutada. Tulemuseks on see, et objekt eksponeerib igale klassile kindla liidese - liikmed, mis on sellele klassile kättesaadavad. Eesmärgiks on see, et selle liidese kliendid ei sõltuks realisatsiooni nendest osadest, mis võivad tulevikus muutuda. Muudatuste tegemine muutub aga lihtsamaks.
Kasutades Pythonis OOP-i põhimõtteid, saame piirata ligipääsu meetoditele ja muutujatele. See hoiab ära andmete otsese muutmise ning seda põhimõtet nimetataksegi kapseldamiseks. Pythonis tähistame privaatseid atribuute kasutades eesliitena ühe või kahekordset alakriipsu: näiteks kui tahame teha privaatset muutujat price
, saame seda teha, kasutades selleks _price
või __price
.
Näide kapseldamisest
Olgu meil näiteks alljärgnev kood:
class Computer:
def __init__(self):
self.__sellingprice = 700
def sell(self):
print(f"Selling Price: {self.__sellingprice}")
def setSellingPrice(self, price):
self.__sellingprice = price
c = Computer()
c.sell()
# change the price
c.__sellingprice = 1000
c.sell()
# setting selling price using setter function
c.setSellingPrice(1000)
c.sell()
Sellisel juhul on koodi käivitamise tulemuseks:
Selling Price: 700
Selling Price: 700
Selling Price: 1000
Ülaltoodud koodinäites tegime me esmalt klassi Computer
ning kasutasime __init__()
meetodit, et salvestada teha maksimaalne müügihind. Nüüd aga, kasutades c.__sellingprice = 1000
, üritame me muuta muutuja __sellingprice
väärtust väljaspool klassi. Kuna aga __sellingprice
on privaatne muutuja (eesliiteks on kaks alakriipsu), siis seda me väljaspool klassi muuta ei saa ning väljundisse tuleb ikka arvuti hinnaks 700
. Selleks, et muuta selle muutuja väärtust, saame kasutada setter funktsiooni, näiteks nagu on meil setSellingPrice()
, mis võtab sisendiks hinna ning muudab arvuti hinda klassi sees.