[python] Dynamicke volani trid
Roman Miklos
RMiklos na pss.sk
Úterý Listopad 7 19:09:54 CET 2006
Neviem ci autor mal presne na mysli metody triedy, alebo myslel na metody
instancie, ale rad by som k tomu dodal toto:
Pretoze
>>> x=a
>>> print x
__main__.a
>>> print x()
<__main__.a instance at 0x00B7FBE8>
>>> x=a()
>>> print x
<__main__.a instance at 0x00B7FBE8>
>>>
tak nevidim na prvy pohlad rozdiel medzi tym, ci sa pouzije
>>> x=a
>>> x().fa()
alebo sa vytvori hned instancia x a pouzije sa jej metoda fa()
>>> x=a()
>>> x.fa()
Az na to, ze v tom prvom pripade sa jedna o vynutene instancovanie, pri
ktorom nevznikne trvanliva instancia (t.j. objekt), ale nejaky nullobjekt.
Ked chcem napriklad zmenit jeho atribut nefunguje to - pozri priklad
dole.
Ale v oboch horeuvedenych pripadoch sa jedna o volanie metody instancie a
nie triedy.
Nie je mi zname, ze by v Pythone boli mozne metody triedy (podobne ako
static v Jave)
Da sa vytvorit neviazana (unbound) metoda
>>> um=a.fa
>>> print um
<unbound method a.fa>
ale pokus o jej zavolanie zlyha
>>> um()
Traceback (most recent call last):
File "<pyshell#17>", line 1, in -toplevel-
um()
TypeError: unbound method fa() must be called with a instance as first
argument (got nothing instead)
Musim vzdy najprv vytvorit instanciu triedy a a potom zavolat um, kde jej
ako prvy parameter odovzdam instanciu
>>> ia=a()
>>> um(ia)
1
Priklad: Problem s vynutenym instancovanim
# definujem triedu
>>> class person:
def __init__(self):
self.name = 'old'
def setname(self, new):
self.name = new
# menim atribut self.name cez vynutene instancovanie
>>> print person().name
old
>>> person().setname('Roman')
>>> print person().name
old
takze nefunguje to- atribut self.name nezmenil hodnotu
# menim atribut self.name normalne t.j. vytvorenim instancie triedy
>>> myperson=person()
>>> print myperson.name
old
>>> myperson.setname('Roman')
>>> print myperson.name
Roman
Takze pozor na vynutene intancovanie - nemusi to fungovat tak jak by sme
si predstavovali :-)
Kto by za kazdu cenu chcel pouzit vynutene instancovanie, ten musi zmenit
class person takto
>>> class person:
name = 'old'
def setname(self, new):
person.name = new
>>> print person().name
old
>>> person().setname('Roman')
>>> print person().name
Roman
mtip <mtip na atlas.cz>
Sent by: python-bounces na py.cz
07.11.2006 16:20
Please respond to
Konference PyCZ <python na py.cz>
To
Konference PyCZ <python na py.cz>
cc
Subject
Re: [python] Dynamicke volani trid
T> Zdravim, nevite nahodou nekdo jestli Python umi zavolat metodu tridy s
T> tim, ze jmeno te tridy je kdesi v promenne? neco jako:
T> class Trida1():
T> def self.akce:
T> nejaka akce...
T> ...
T> class Trida2():
T> def self.akce:
T> jina akce...
T> ....
T> a = "Trida1"
T> a.akce /* by se pak interpretovalo jako Trida1.akce.*/
T> a = "Trida2"
T> a.akce /* by se pak interpretovalo jako Trida1.akce. */
T> Diky moc.
T> Tom
Odkazem na tridu, by to mohlo byt nejak takhle.
class a:
def fa(self):
print 1
class b:
def fa(self):
print 2
x=a
x().fa() #print 1
x=b
x().fa() #print 2
Mirek.
_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python
Mgr. Ing. Roman MIKLÓ©
Prvá stavebná sporiteµňa a.s.
, P. O. Box 48
Tel.:
Fax:
Daląí informace o konferenci Python