Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: super()

vesimies [31.07.2010 12:33:33]

#

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?highlight=super#super (kelaa kohtaan super)

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. ???

Chiman [31.07.2010 12:39:24]

#

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.

vesimies [31.07.2010 13:14:18]

#

Kiitos. Kannattaisikohan siirtyä näin heti alussa tuohon 3:een?

Chiman [31.07.2010 13:26:30]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta