Вызовите метод Python по имени - PullRequest
62 голосов
/ 19 августа 2010

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

class Foo:
    def bar1(self):
        print 1
    def bar2(self):
        print 2

def callMethod(o, name):
    ???

f = Foo()
callMethod(f, "bar1")

Ответы [ 5 ]

92 голосов
/ 19 августа 2010

Easy one:

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 для установки атрибутов класса по именам.

5 голосов
/ 01 марта 2013

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

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 потрясающий!

2 голосов
/ 19 августа 2010
getattr(globals()['Foo'](), 'bar1')()
getattr(globals()['Foo'](), 'bar2')()

Нет необходимости сначала создавать Foo!

1 голос
/ 19 августа 2010
def callmethod(cls, mtd_name):    
    method = getattr(cls, mtd_name)
    method()
0 голосов
/ 02 марта 2017

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

Замечательные декораторы Python.Брюс Экель (Thinking in Java) прекрасно описывает здесь декораторов Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...