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