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("Selling Price: {}".format(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.