Seite 1 von 1

funktionen "by name" ansprechen

Verfasst: Montag 29. Oktober 2007, 10:40
von hobbes_dmS
moin,
kann man eine funktion "by name" ansprechen (z.B. so wie bei einer Instanzvariable?)

Beispiel:

Code: Alles auswählen

class A:
	def __init__(self):
		self.a = "hallo"

	def somefunc(self, text):
		print "doing", text
mit

Code: Alles auswählen

a = A()
und

Code: Alles auswählen

a.__dict__['a']
komme ich an das "hallo".

kann ich ähnlich auch an die funktion kommen?
ich stell mir das ungefähr so vor:

Code: Alles auswählen

a.__func__['somefunc']('important stuff')
und die Ausgabe wäre "doing imporant stuff"
(wobei "__func__" natürlich wild erfunden ist)

geht das irgendwie?

thx im Voraus
hobbes

PS:
über

Code: Alles auswählen

dir(A)
bekomme ich
['__doc__', '__init__', '__module__', 'somefunc']

über

Code: Alles auswählen

dir(a)
nur noch
['__doc__', '__init__', '__module__', 'a']

und bei

Code: Alles auswählen

dir(a.__class__)
erhalte ich
['__doc__', '__init__', '__module__']

da taucht "somefunc" leider nicht mehr auf... sonst wäre ich über

Code: Alles auswählen

a.__class__.__dict__['somefunc']
gegangen.

edit:
aaargh, geht ja doch... und zwar so:
a.__class__.__dict__['somefunc'](a, 'important stuff')

geht das auch direkter??

Verfasst: Montag 29. Oktober 2007, 10:46
von Rebecca

Code: Alles auswählen

f = getattr(a, somefunc)
f("bla")

Verfasst: Montag 29. Oktober 2007, 11:05
von Zap
Korrigiert und als vollständiges Beispiel:

Code: Alles auswählen

In [1]: class A(object):
   ...:     def somefunc(self, arg):
   ...:         print arg
   ...:
   ...:

In [2]: a = A()

In [3]: f = getattr(a, "somefunc")

In [4]: f("bla")
bla

Verfasst: Montag 29. Oktober 2007, 11:10
von hobbes_dmS
Vielen Dank!
funktioniert einwandfrei.

Verfasst: Montag 29. Oktober 2007, 11:26
von Jona
hilfreich ist dabei auch hasattr() sonst bekommst du einen attributeerror falls die methode nicht existiert.