Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
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}