[python] Dynamicke volani trid

mtip mtip na atlas.cz
Úterý Listopad 7 20:39:47 CET 2006


Myslel jsem to takhle -- tady je podle me rozdil mezi x=a  a instanci x=a()

# 1.
class a:
    def __init__(self):
        print 1

x=a  #neprintne nic
x=a()   #print 1

# 2.
x=a  #pri x=a() to samozrejme selze
class aa(x):
    def __init__(self):
        x.__init__(self)

    def add(self):
        self.mx=5

d=aa()

#asi jsem si to vylozil tak, ze o tohle autorovi puvodne slo
Mirek








--------------------------------------------------------------------------------------------------------------------
RM> Neviem ci autor mal presne na mysli metody triedy, alebo myslel na metody
RM> instancie, ale rad by som k tomu dodal toto:

RM> Pretoze
>>>> x=a
>>>> print x
RM> __main__.a
>>>> print x()
RM> <__main__.a instance at 0x00B7FBE8>
>>>> x=a()
>>>> print x
RM> <__main__.a instance at 0x00B7FBE8>
>>>> 

RM> tak nevidim na prvy pohlad rozdiel medzi tym, ci sa pouzije
>>>> x=a
>>>> x().fa()
RM> alebo sa vytvori hned instancia x a pouzije sa jej metoda fa() 
>>>> x=a()
>>>> x.fa()
RM> Az na to, ze v tom prvom pripade sa jedna o vynutene instancovanie, pri
RM> ktorom nevznikne trvanliva instancia (t.j. objekt), ale nejaky nullobjekt.

RM> Ked chcem napriklad zmenit jeho atribut nefunguje to -  pozri priklad
RM> dole. 

RM> Ale v oboch horeuvedenych pripadoch sa jedna o volanie metody instancie a
RM> nie triedy.
RM> Nie je mi zname, ze by v Pythone boli mozne metody triedy (podobne ako
RM> static v Jave)
RM> Da sa vytvorit neviazana (unbound) metoda
>>>> um=a.fa
>>>> print um
RM> <unbound method a.fa>

RM> ale pokus o jej zavolanie zlyha
>>>> um()
RM> Traceback (most recent call last):
RM>   File "<pyshell#17>", line 1, in -toplevel-
RM>     um()
RM> TypeError: unbound method fa() must be called with a instance as first
RM> argument (got nothing instead)

RM> Musim vzdy najprv vytvorit instanciu triedy a a potom zavolat um, kde jej
RM> ako prvy parameter odovzdam instanciu
>>>> ia=a()
>>>> um(ia)
RM> 1




RM> Priklad: Problem s vynutenym instancovanim

RM> # definujem triedu 
>>>> class person:
RM>         def __init__(self):
RM>                 self.name = 'old'
RM>         def setname(self, new):
RM>                 self.name = new

RM> # menim atribut self.name cez vynutene instancovanie 
>>>> print person().name
RM> old
>>>> person().setname('Roman')
>>>> print person().name
RM> old

RM> takze nefunguje to- atribut self.name nezmenil hodnotu


RM> # menim atribut self.name normalne t.j. vytvorenim instancie triedy
>>>> myperson=person()
>>>> print myperson.name
RM> old
>>>> myperson.setname('Roman')
>>>> print myperson.name
RM> Roman




Další informace o konferenci Python