Joskus halutaan piilottaa luokan jäsenmuuttujat niin, ettei niitä voi muokata luokan ulkopuolelta muuta kuin luokan metodien kautta. Tälläistä piilottamista kutsutaan kapseloinniksi.
 
Tämä tehdään, jotta luokan jäsenmuuttujiin ei sijoitettaisi vääränlaisia arvoja. Metodien avulla voidaan varmistaa, että luokan sisäisiä tietoja käsitellään oikein. Tämä ei ole välttämätöntä, mutta tekee ohjelman toiminnasta selkeämpää kun olioiden tiedot muuttuvat vain ennaltamäärätyllä tavalla.
 
Toinen syy on erottaa käyttöliittymä toteutuksesta - tätä kutsutaan abstraktisoinniksi. Abstraktisointia käytetään kätkemään tietokoneessa yksityiskohtaiset ja monimutkaiset alemman tason toiminnot havainnollisemman käyttöliittymän alle.
 
Pythonissa jäsenmuuttujista tehdään yksityisiä aloittamalla muuttujan nimi alaviivalla. Yksityisiä muuttujia ei voi muuttaa kuin luokan sisällä eli sen metodeissa.
 
Tässä on esimerkki monimutkaisemmasta luokasta lpFilter, joka toimii alipäästösuodattimena. Alipäästösuodin on yksi perussuodattimista; se suodattaa signaalista korkeat taajuudet pois. Sille syötetään arvo metodin insertValue avulla, joka palauttaa suodatetun arvon. Suodatus tehdään ottamalla liukuvakeskiarvo suodattimelle syötetyistä arvoista. Keskiarvon laskemiseen käytettävistä jäsenmuuttujista tehdään yksityisiä, jotta niitä ei muuteltaisi luokan ulkopuolelta.

class lpFilter:
    _numberOfValues = 10
    _values = [0.0] * 10
    _pointer = 0
    _output = 0.0
    def getValue(self):
        return self._output
    def insertValue(self, x):
        self._values[self._pointer] = x
        self._pointer = (self._pointer + 1) % self._numberOfValues
        self._calculateOutput()
        return self._output
    def _calculateOutput(self):
        sum = 0.0
        for i in self._values:
            sum += i
        self._output = sum / self._numberOfValues

Tämän luokan olion jäsenmuuttujia _numberOfValues, _values, _pointer ja _output ei voida muuttaa luokan ulkopuolelta, mutta metodit getValue ja insertValue palauttavat kutsuttaessa muuttujan _output arvon. Myös metodi _calculateOutput on myös yksityinen; metodien muuttamien yksityiseksi tapahtuu samaan tapaan kuin jäsenmuuttujien muuttaminen yksityisiksi.

  • No labels
You must log in to comment.