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.
Code Block |
---|
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.
Code Block |
---|
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.
Code Block |
---|
>>> a = lpFilter(2) >>> b = lpFilter(2) >>> a.insertValue(10) 5.0 >>> b.insertValue(44) 22.0 >>> a + b 27.0 >>> |