Передать метод в функцию, используя имя метода из строковой переменной - PullRequest
0 голосов
/ 07 марта 2020

У меня есть класс с конструктором, двумя другими методами и списком членов с именами двух методов.

class Foo():
    def __init__(self):
        self.methods = ["self.foo", "self.bar"]
    def foo(self):
        print("foo")
        return 0
    def bar(self):
        print("bar")
        return 0

У меня есть функция, которая принимает функцию в качестве аргумента, например так .

myFunction(func)

Функция имеет глобальную область видимости и будет использоваться следующим образом.

myFunction(self.foo)

Я хочу перебрать элементы в списке self.methods и сделать вызов функция для каждого имени метода, но, как и ожидалось, передается строка, а не сам метод. Как передать метод, как в примере выше, например self.foo, а не "self.foo"?

Ответы [ 3 ]

2 голосов
/ 07 марта 2020

Насколько я понимаю, вы можете попробовать это.

class Foo():
    def __init__(self):
        self.method=['foo','bar']
    def foo(self):
        print('foo')
    def bar(self):
        print('bar')
    def run_all(self):
        for m in self.method:
            getattr(self,m)()

a=Foo()
a.run_all() # iterating through self.method and executing them
# foo
# bar
0 голосов
/ 07 марта 2020

Как насчет:

class Foo():
    def __init__(self):
        self.methods = self.foo, self.bar

    def run_methods(self):
        for method in self.methods:
            print('Running method {}'.format(method.__name__))
            method()

    def foo(self):
        print("foo")
        return 0

    def bar(self):
        print("bar")
        return 0

Итак, вы можете запустить ваши методы, вызвав run_methods. Если вы также хотите получить доступ к их именам, вы всегда можете сделать это с помощью соответствующих им __name__ методов, как указано выше.

f = Foo()
f.run_methods() 

# Output:
#
# Running method foo
# foo
# Running method bar
# bar

РЕДАКТИРОВАТЬ: Как предложил другой человек, вы должны отредактировать свой вопрос, чтобы описать в подробнее, что делает myFunction (веселье). Но, inded, вы, вероятно, должны использовать другой подход, чем передача фактических имен в виде строк.

0 голосов
/ 07 марта 2020

Хочешь что-нибудь подобное?

class Foo():
    def __init__(self):
        self.methods = [self.foo(), self.bar()]
    def foo(self):
        print("foo")
        return 0
    def bar(self):
        print("bar")
        return 0


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