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.