[python] class a subclass

Roman Miklos RMiklos na pss.sk
Pátek Listopad 10 19:09:03 CET 2006


Vsetko funguje jak ma,  pozri na toto
--------------------
class a(object):
    def prn(self):
        print 'a',self
    def ma(self):
        print "ma() rodica", self
        self.prn()
    def aa(self):
        pass

class b(a):
    def prn(self):
        print 'b',self
    def ma(self):
        '''prekryje a.ma()'''
        print "ma() potomka", self 
        super(b,self).ma()
    def ba(self):
        pass


x=b()
x.ma()
----------------

ked to spustis dostanes toto
ma() potomka <__main__.b object at 0x00A22F50>
ma() rodica <__main__.b object at 0x00A22F50>
b <__main__.b object at 0x00A22F50>

1) takze najprv si v ma()-potomka, to ti vypise
ma() potomka <__main__.b object at 0x00A22F50>
tu ma self objektu x hodnotu <__main__.b object at 0x00A22F50>

2) teraz super(b,self).ma() 
zavola ma() rodica (triedy a) ale odovzda jej self potomka, t.j. objektu x
t.j. ako vidis to iste cislo: <__main__.b object at 0x00A22F50>

3)Teraz v ma()-rodica volas
self.prn(), lenze self ma hodnotu <__main__.b object at 0x00A22F50> a to 
mu odovzdas, a to je referncia na potomka, takze sa zavola metoda 
prn z potomka (a nie z rodica) a ta ti vytiskne 
b <__main__.b object at 0x00A22F50>
self rodica si nikde nezistil, lebo si tam nevytvoril na neho instanciu a 
tak ani nemozes zavolat jeho metodu prn()

V Pythone realizovali OOP (podla mna) podobne ako v Perle, jedna sa 
vlastne o slovniky referencii ci uz na datove struktury, alebo na kod.
V Perle OOP na nizsej urovni (to je primitivnejsie), ale clovek tam zas 
lepsie vidi preco je to tak a jak to funguje.






mtip <mtip na atlas.cz> 
Sent by: python-bounces na py.cz
10.11.2006 18:14
Please respond to
Konference PyCZ <python na py.cz>


To
Konference PyCZ <python na py.cz>
cc

Subject
Re: [python] class a subclass






>>Proc by mel Python hledat
>>nejprve metodu v potomku, kdyz ji volam z rodice ?

RM> ale ty vytvoris instanciu potomka a volas teda metodu potomka takto
RM> x=b()
RM> x.ma()

ME NEJDE O TO x.ma(). JDE O TO:
x.ma()- > vola ma() v potomku = OK
ma() uvnitr vola rodicovske ma() = OK
rodicovske ma() uvnitr vola self.prn() a to se vrati k potomkovi,
protoze existuje stejna metoda b.ma()  a to je podle me chyba !
tady by mel rodic volat svoje ma().
Mirek.
















RM> mtip <mtip na atlas.cz> 
RM> Sent by: python-bounces na py.cz
RM> 10.11.2006 17:24
RM> Please respond to
RM> Konference PyCZ <python na py.cz>


RM> To
RM> Konference PyCZ <python na py.cz>
RM> cc

RM> Subject
RM> Re: [python] class a subclass






RM> Zkusil jsem super a vysledek je ten samy.
RM> class a(object):
RM>     def prn(self):
RM>         print 'a',self
RM>     def ma(self):
RM>         self.prn()
RM>     def aa(self):
RM>         pass

RM> class b(a):
RM>     def prn(self):
RM>         print 'b',self
RM>     def ma(self):
RM>         '''prekryje a.ma()'''
RM>         super(b,self).ma()
RM>     def ba(self):
RM>         pass


RM> x=b()
RM> x.ma()
 

RM> Zjistil jsem, ze to funguje, jen pokud to zavolam takto:
RM> class b(a):
RM>     def prn(self):
RM>         print 'b',self
RM>     def ma(self):
RM>         '''prekryje a.ma()'''
RM>         a.ma(a())
RM>     def ba(self):
RM>         pass

RM> Coz je samozrejme nesmysl, protoze vytvarim novou instanci a.
RM> Tak se mi zda, ze tohle je neprijemna chyba. Proc by mel Python hledat
RM> nejprve metodu v potomku, kdyz ji volam z rodice ?

RM> Mirek.

s>> Pouľij slovo super.

s>> super(a,x).ma()

s>> Miloslav Ponkrác

RM> _______________________________________________
RM> Python mailing list
RM> Python na py.cz
RM> http://www.py.cz/mailman/listinfo/python


RM> Mgr. Ing. Roman MIKLÓ© 
RM> Prvá stavebná sporiteµňa a.s. 
RM> Bajkalská 30, P. O. Box 48 
RM> 829 48  Bratislava 25 
RM> Tel.: +421/ 2 / 582 31 174 
RM> Fax: +421/ 2 / 582 31 109 

RM> _______________________________________________
RM> Python mailing list
RM> Python na py.cz
RM> http://www.py.cz/mailman/listinfo/python



_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python


Mgr. Ing. Roman MIKLÓ© 
Prvá stavebná sporiteµňa a.s. 
Bajkalská 30, P. O. Box 48 
829 48  Bratislava 25 
Tel.: +421/ 2 / 582 31 174 
Fax: +421/ 2 / 582 31 109 



Daląí informace o konferenci Python