[python] Dynamicke volani trid

2006-11-07 Tema obsahu Tom
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

2006-11-07 Tema obsahu Tomas Brabenec
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

2006-11-07 Tema obsahu mtip
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

2006-11-07 Tema obsahu Roman Miklos
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

2006-11-07 Tema obsahu Jan Matejka
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


[python] Statické metody v Pythonu

2006-11-07 Tema obsahu superman
Nevíte, jak udělat statickou metody v Pythonu, myslím metodu, které není 
vázána k instanci, tedy self, ale jen ke třídě.

Zkoušel jsem:

class trida:

def static(i):
print i


trida.static(3)

A dostal jsem chybové hlášení, že se Pythonu nelíbí, že předávám číslo a 
ne instanci. Určitě to nějak jde, ale po pokusu někde se to dočíst to 
vzdávám. Nevíte jak na to?
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


[python] Statické metody v Pythonu

2006-11-07 Tema obsahu superman
Nevíte, jak udělat statickou metody v Pythonu, myslím metodu, které není 
vázána k instanci, tedy self, ale jen ke třídě.

Zkoušel jsem:

class trida:

def static(i):
print i


trida.static(3)

A dostal jsem chybové hlášení, že se Pythonu nelíbí, že předávám číslo a 
ne instanci. Určitě to nějak jde, ale po pokusu někde se to dočíst to 
vzdávám. Nevíte jak na to?
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] Statické metody v Pythonu

2006-11-07 Tema obsahu Jan Matejka
s použitím dekorátoru

class S(object):
@staticmethod
def staticM(pp):
print pp*2

S.staticM(nazdar )

více:
http://www.ddj.com/184406073

Jan Matějka 

 -Original Message-
 From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On 
 Behalf Of superman
 Sent: Tuesday, November 07, 2006 7:59 PM
 To: Konference PyCZ
 Subject: [python] Statické metody v Pythonu
 
 Nevíte, jak udělat statickou metody v Pythonu, myslím metodu, 
 které není vázána k instanci, tedy self, ale jen ke třídě.
 
 Zkoušel jsem:
 
 class trida:
 
   def static(i):
   print i
 
 
 trida.static(3)
 
 A dostal jsem chybové hlášení, že se Pythonu nelíbí, že 
 předávám číslo a ne instanci. Určitě to nějak jde, ale po 
 pokusu někde se to dočíst to vzdávám. Nevíte jak na to?
 ___
 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

2006-11-07 Tema obsahu mtip
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