Как я могу зациклить dict и использовать значение как функции объекта?

1

У меня есть словарь значений и инициализация объекта. Значения словаря содержат все модули объекта, поэтому как я могу добиться чего-то подобного?

test_action = {
    '1': 'addition',
    '2': 'subtraction'
}

class test:
    def __init__(self, a,b,c):
        self.a = a
        self.b = b
        self.c = c

    def addition(self):
        return self.a + self.b + self.c

    def subtraction(self):
        return self.a - self.b - self.c


def main():
    xxx = test(10,5,1)
    for key,action in test_action.items():
        print(xxx.action())
Теги:
loops
dictionary

2 ответа

0
Лучший ответ

Вы должны ссылаться на функции как объекты, а не на строки, так что:

class test:
    def __init__(self, a,b,c):
        self.a = a
        self.b = b
        self.c = c

    def addition(self):
        return self.a + self.b + self.c

    def subtraction(self):
        return self.a - self.b - self.c

test_action = {
    '1': test.addition,
    '2': test.subtraction
}

xxx = test(10,5,1)
for key, action in test_action.items():
    print(key, action(xxx))

будет выводить:

1 16
2 4
  • 0
    цель состояла в том, чтобы иметь список действий в последовательности (словарь не отсортирован) в общей форме, чтобы я мог использовать диапазон и выполнять методы в последовательности независимо от имени объекта инициализации. я нашел другой способ после поиска по максимуму и минимуму, print (eval ('xxx.' + action + '()'))
  • 0
    Использование eval обычно не рекомендуется из-за проблем с безопасностью и производительностью. Разве код в моем ответе выше не выполняет то же самое?
Показать ещё 2 комментария
0
def main():
    xxx = test(10,5,1)
    for key,action in test_action.items():
        if hasattr(xxx, action):
            print "perforning: {}".format(action)
            print xxx.__getattribute__(action)()

#op
perforning: addition
16
perforning: subtraction
4
  • 0
    привет @ Даниил, ты это проверял?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню