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