2010-10-17 43 views
27

En python, supongo que tengo una cadena que contiene el nombre de una función de clase que sé que tendrá un objeto en particular, ¿cómo puedo invocarla?Python: cómo invocar una función en un objeto dinámicamente por su nombre?

Es decir:

obj = MyClass() # this class has a method doStuff() 
func = "doStuff" 
# how to call obj.doStuff() using the func variable? 
+1

Tengo curiosidad acerca de por qué se necesita para hacer esto. Esto parece que puedes estar haciendo algo de la manera difícil. ¿Podría explicar su situación? – JoshD

+0

Tengo una aplicación cli donde quiero aceptar comandos desde la línea de comandos, pero no quiero hacer algo como: "if command = 'doThing', luego obj.doThing() elseif command = 'someOtherThing' ... y Entonces, quiero agregar métodos a la clase de controlador y luego estarán automáticamente disponibles en el cli –

+0

¿Está bien hacerlo? ¿En qué situaciones este enfoque no sería una buena idea? Estoy en una situación similar también, pero no estoy seguro si iré por este camino. De alguna manera, creo que sería más claro si utilizo explícitamente la bifurcación en lugar de otro. ¿Qué piensas? Gracias! – ultrajohn

Respuesta

44

Uso "getattr": http://docs.python.org/library/functions.html?highlight=getattr#getattr

obj = MyClass() 
try: 
    func = getattr(obj, "dostuff") 
    func() 
except AttributeError: 
    print "dostuff not found" 
+0

Este enlace también está teniendo un ejemplo útil y un ejemplo importante de la pregunta anterior https://gist.github.com/hygull/41f94e64b84f96fa01d04567e27eb46b –

Cuestiones relacionadas