Wiki Markup |
---|
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} |