Re: [python] Dynamicke volani trid
Diky vsem za pomoc. Tom On Nov 7, 8:39 pm, mtip [EMAIL PROTECTED] 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 ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] Dynamicke volani trid
Zdravim, nevite nahodou nekdo jestli Python umi zavolat metodu tridy s tim, ze jmeno te tridy je kdesi v promenne? neco jako: class Trida1(): def self.akce: nejaka akce... ... class Trida2(): def self.akce: jina akce... a = Trida1 a.akce /* by se pak interpretovalo jako Trida1.akce.*/ a = Trida2 a.akce /* by se pak interpretovalo jako Trida1.akce. */ Diky moc. Tom ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Dynamicke volani trid
Mrkni do manualu na exec() Mohlo by ti to pomoci. TB On 7.11.2006 15:38, Tom wrote: Zdravim, nevite nahodou nekdo jestli Python umi zavolat metodu tridy s tim, ze jmeno te tridy je kdesi v promenne? neco jako: class Trida1(): def self.akce: nejaka akce... ... class Trida2(): def self.akce: jina akce... a = Trida1 a.akce /* by se pak interpretovalo jako Trida1.akce.*/ a = Trida2 a.akce /* by se pak interpretovalo jako Trida1.akce. */ Diky moc. Tom ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
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@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Dynamicke volani trid
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 [EMAIL PROTECTED] Sent by: [EMAIL PROTECTED] 07.11.2006 16:20 Please respond to Konference PyCZ python@py.cz To Konference PyCZ python@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@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: ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Dynamicke volani trid
Pokud se jedná o to vytvořit třídu na základě textu, tak se dá využít funkce local: class a: def fa(self): print 1 #nalezeni tridy trida=locals()[a] #vytvoreni instance nalezene tridy ai=trida() ai.fa() Jan Matějka -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Tom Sent: Tuesday, November 07, 2006 3:39 PM To: python@py.cz Subject: [python] Dynamicke volani trid Zdravim, nevite nahodou nekdo jestli Python umi zavolat metodu tridy s tim, ze jmeno te tridy je kdesi v promenne? neco jako: class Trida1(): def self.akce: nejaka akce... ... class Trida2(): def self.akce: jina akce... a = Trida1 a.akce /* by se pak interpretovalo jako Trida1.akce.*/ a = Trida2 a.akce /* by se pak interpretovalo jako Trida1.akce. */ Diky moc. Tom ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Dynamicke volani trid
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 ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python