[python] Dynamicke volani trid

Tom tomas.markus na gmail.com
Středa Listopad 8 13:14:08 CET 2006


Diky vsem za pomoc.

Tom

On Nov 7, 8:39 pm, mtip <m... na atlas.cz> wrote:
> 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 xRM> <__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 umRM> <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().nameRM> 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.nameRM> Roman



Další informace o konferenci Python