[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