Llame a un método de Python por su nombre

Si tengo un objeto y un nombre de método en una cadena, ¿cómo puedo llamar al método?

class Foo: def bar1(self): print 1 def bar2(self): print 2 def callMethod(o, name): ??? f = Foo() callMethod(f, "bar1") 

Fácil:

 class Foo: def bar1(self): print 1 def bar2(self): print 2 def callMethod(o, name): getattr(o, name)() f = Foo() callMethod(f, "bar1") 

Echa un vistazo a getattr

También puede usar setattr para configurar los atributos de clase por nombres.

Tuve una pregunta similar, quería llamar al método de instancia por referencia. Aquí hay cosas graciosas que encontré:

 instance_of_foo=Foo() method_ref=getattr(Foo, 'bar') method_ref(instance_of_foo) # instance_of_foo becomes self instance_method_ref=getattr(instance_of_foo, 'bar') instance_method_ref() # instance_of_foo already bound into reference 

Python es increíble!

 getattr(globals()['Foo'](), 'bar1')() getattr(globals()['Foo'](), 'bar2')() 

¡No hay necesidad de crear una instancia de Foo primero!

 def callmethod(cls, mtd_name): method = getattr(cls, mtd_name) method() 

Aquí hay una versión más generalizada usando decoradores de Python. Puedes llamar por nombre corto o largo. Lo encontré útil al implementar CLI con sub comandos cortos y largos.

Los decoradores de python son maravillosos. Bruce Eckel (Pensando en Java) describe a los decoradores de Python maravillosamente aquí.

http://www.artima.com/weblogs/viewpost.jsp?thread=240808 http://www.artima.com/weblogs/viewpost.jsp?thread=240845

 #!/usr/bin/env python2 from functools import wraps class CommandInfo(object): cmds = [] def __init__(self, shortname, longname, func): self.shortname = shortname self.longname = longname self.func = func class CommandDispatch(object): def __init__(self, shortname, longname): self.shortname = shortname self.longname = longname def __call__(self, func): print("hello from CommandDispatch's __call__") @wraps(func) def wrapped_func(wself, *args, **kwargs): print('hello from wrapped_func, args:{0}, kwargs: {1}'.format(args, kwargs)) func(wself, *args, **kwargs) ci = CommandInfo ci.cmds += [ci(shortname=self.shortname, longname=self.longname, func=func)] return wrapped_func @staticmethod def func(name): print('hello from CommandDispatch.func') for ci in CommandInfo.cmds: if ci.shortname == name or ci.longname == name: return ci.func raise RuntimeError('unknown command') @CommandDispatch(shortname='co', longname='commit') def commit(msg): print('commit msg: {}'.format(msg)) commit('sample commit msg') # Normal call by function name cd = CommandDispatch short_f = cd.func(name='co') # Call by shortname short_f('short sample commit msg') long_f = cd.func(name='commit') # Call by longname long_f('long sample commit msg') class A(object): @CommandDispatch(shortname='Aa', longname='classAmethoda') def a(self, msg): print('Aa called, msg: {}'.format(msg)) a = A() short_fA = cd.func(name='Aa') short_fA(a, 'short Aa msg') long_fA = cd.func(name='classAmethoda') long_fA(a, 'short Aa msg')