You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Pythonissa luokille on määritelty useita operaattoreita ja erikoistilanteissa aktivoituvia metodeja, joita ei voi määrittää suoraan samalla tavalla kuin tavallisia metodeja. Näihin metodeihin sisältyy useat operaattorit kuten +, * ja indeksointi

Nämä toiminnot pääsee määrittämään luokalle nimeämällä metodi tiettyä toimintoa kuvaavalla sisäänrakennetulla tunnisteella. Kaikkien tälläisten tunnisteiden nimet alkavat ja loppuvat kahdella alaviivalla. Esimerkiksi _init_ on muodostinfunktio; metodi, jota kutsutaan kun olio luodaan. Sille voi välittää parametreja niinkuin muillekkin funktioille.

Tässä esimerkissä lpFilter luokkaan on lisätty muodostinfunktio, joka ottaa parametrikseen kokonaisluvun, jonka avulla voi määrittää kuinka monesta luvusta keskiarvo otetaan. Osa luokan jäsenmuuttujista alustetaan nyt muodostin funktiossa.

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

Muut vastaavat erikoismetodit on lueteltu Pythonin dokumentaatiossa - kohdassa "Python Language Reference" > "Data model". Tässä on vielä (hieman keinotekoinen) esimerkki operaattorin määrittelystä. Luokkaan lpFilter on lisätty funktio _add_, jonka avulla määritellään yhteenlasku operaattorin toiminta - tässä tapauksessa kahdelle lpFilter oliolle.

Funktio ottaa parmametrikseen operaattorin oikealla puolella olevan olion, vasemman puolen ollessa olio, jonka metodia kutsutaan; eli x + y on sama kuin x._add_(y). Lasku palauttaa kahden lpFilter olion ulostulon summan.

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

Kuten koodista näkyy, olion yksityisten jäsenmuuttujien muokkaaminen on mahdollista ei vain olion itsensä sisällä, vaan toisessa saman luokan oliossa. Tässä tapauksessa metodissa _add_ käytetään parametrin rside jäsenmuuttujaa _output suoraan vaikka se on yksityinen. Luokka toimii ja sitä voikin testata vaikka interaktiivisesti.

>>> a = lpFilter(2)
>>> b = lpFilter(2)
>>> a.insertValue(10)
5.0
>>> b.insertValue(44)
22.0
>>> a + b
27.0
>>>
  • No labels
You must log in to comment.