[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