Вызов метода Python по имени

Если у меня есть объект и имя метода в строке, как я могу вызвать метод?

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

  • Выполнение действия при неожиданном выходе python
  • Ускорение re.sub в python
  • Что такое termios.TIOCGWINSZ
  • Запуск вторичного скрипта в новом терминале
  • Как я могу удалить значения из соответствующих списков?
  • Функция вызова Python с пользовательского ввода
  • Как я могу использовать bcrypt / scrypt для appengine для Python?
  • Как писать большие файлы в Blobstore с помощью экспериментального API?
  • 5 Solutions collect form web for “Вызов метода Python по имени”

    Легкий:

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

    Взгляните на getattr

    Вы также можете использовать setattr для установки атрибутов Class по именам.

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

    Не нужно сначала создавать Foo!

    У меня был аналогичный вопрос, я хотел вызвать метод экземпляра по ссылке. Вот забавные вещи, которые я нашел:

     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 поражает!

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

    Вот более обобщенная версия, использующая декораторы Python. Вы можете позвонить по короткому или длинному имени. Я счел это полезным при реализации CLI с короткими и длинными подкомандами.

    Декораторы Python замечательные. Брюс Эккель («Мышление на Java») красиво описывает декораторы Python.

    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') 
    Interesting Posts

    Динамика pyqt генерирует действие QMenu и соединяет

    Автоматизация ввода для терминала

    Matplotlib 3D plot – 2D-формат для ввода данных?

    Colon (:) в индексе списка Python

    Поворот Typeerror не может быть вызван. Я пытаюсь понять, почему мой оператор elif не может быть вызван

    Получить дату с номера недели

    Почему __getattribute__ не вызывается при неявном вызове __getitem __-invocation?

    «ImportError: нет модуля с именем« запросы »после установки с помощью pip

    ValueError: операция ввода-вывода в закрытом файле

    Почему моя база данных Cassandra так медленно считывает данные? Я хотел бы прочитать 100 000 строк менее чем за 10 секунд

    Как заявление печати создает локальные переменные

    python pandas: обратный порядок столбцов df

    Список Python для цикла

    Как STDIN и STDOUT с PHP и Python использовать html2text и получить отформатированный текст?

    Ошибка в программе переименования Python … Нет такого файла или каталога (Fnmatch)

    Python - лучший язык программирования в мире.