Opettelen tässä hieman Pythonia.
Yliluokan metodiin pitäisi päästä käsiksi (ilman yliluokan nimen kirjoittamista) näin:
class C(B): def method(self, arg): super(C, self).method(arg)
Lähde: http://docs.python.org/library/functions.html?
Seuraava testikoodi
class KantaLuokka: _luku = 1 def tee_jotain(self, argh): self._luku *= argh return self._luku class Perillinen(KantaLuokka): def tee_jotain(self, argh): return super(Perillinen, self).tee_jotain(argh) k = KantaLuokka() print k.tee_jotain(3) p = Perillinen() print p.tee_jotain(3)
kuitenkin tuottaa tulostuksen:
3
Traceback (most recent call last):
File "perinta.py", line 38, in <module>
print p.tee_jotain(3)
File "perinta.py", line 32, in tee_jotain
return super(Perillinen, self).tee_jotain(argh)
TypeError: super() argument 1 must be type, not classobj
En tajua. ???
Peri KantaLuokka object-luokasta, eli muuta ensimmäinen rivi tällaiseksi:
class KantaLuokka(object):
Lisäys:
Linkkaamasi ohjekin kertoo saman:
lainaus:
Note
super() only works for new-style classes.
...josta linkin löytyy takaa selitys, mikä on new-style class:
lainaus:
Any class which inherits from object.
Python 3:ssa omatkin luokat ovat automaattisesti objectista perityt. 2.x:ssä periminen pitää tehdä erikseen mainiten.
Lisäys #2:
Koodisi ei taida muutenkaan tehdä sitä mitä haluat. self viittaa aina kulloinkin käsiteltävään olioon. KantaLuokka määrittelee luokkatasolle _luku-muuttujan. Muutat sitä ensin KantaLuokasta luodulle oliolle paikallisesti (3 * 1 = 3). Sitten toisella kerralla kun saavut tee_jotain-metodiin, self eli nykyinen olio onkin Perillinen-luokasta johdettu eri olio, jolle _luku on edelleen kantaluokasta johtuva 1.
Voit esim. kokeilla self._lukun tilalle KantaLuokka._lukua.
Kiitos. Kannattaisikohan siirtyä näin heti alussa tuohon 3:een?
vesimies kirjoitti:
Kiitos. Kannattaisikohan siirtyä näin heti alussa tuohon 3:een?
Tuohon ei ole yhtä oikeaa vastausta, eli riippuu tilanteesta ja tavoitteista.
Python 2.x-kehityslinja on kypsä, sille on hyvin tarjolla kirjastoja ja se on muutenkin laajalti tuettu. Python 3 on sinänsä toimiva, mutta sen käyttöönotto on ollut hidasta, koska se rikkoo yhteensopivuuden taaksepäin.
Oma neuvoni on: opettele Python 2.x, ellet jostain erityisestä syystä tarvitse kolmosta. Kolmosen opettelu on kakkosen jälkeen helppoa; muutokset ovat kuitenkin niin vähäisiä jokapäiväistä käyttöä ajatellen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.