Использование getattr () для себя - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть класс, и в одном из методов класса у меня есть строка, полученная из пользовательского ввода, которая затем отображается на соответствующий метод (технически это str представление метода).Как я могу вызвать этот метод без создания экземпляра класса, то есть с self.аргумент.Я включил то, что, как я думал, будет работать, но это не так ...

class RunTest():
      def __init__(self, method_name):
          self.method_name = method_name #i.e., method_name = 'Method 1'

      def initialize_test(self):
          mapping = {'Method 1': 'method1()', 'Method 2': 'method2()', ...}
          test_to_run = getattr(self, mapping[self.method_name])

      def method1(self):
          ....

      def method2(self):
          ....

1 Ответ

0 голосов
/ 28 сентября 2019

Если я правильно понимаю, вы хотели бы сопоставить свой атрибут классов с методом, основанным на вводе пользователем.Это должно делать то, что вы хотите:

class YourClass:
    def __init__(self, method_name):
        mapping = {'Method 1': self.method_one,
                    'Method 2': self.method_two}

        self.chosen_method = mapping[method_name]

    def method_one(self):
        print('method one')

    def method_two(self):
        print('method two')

while True:
    name = input("enter 'Method 1' or 'Method 2'")
    if name != 'Method 1' and name != 'Method 2':
        print('Invalid entry')
    else:
        break

your_class = YourClass(name)
your_class.chosen_method()

Это позволяет вообще не использовать getattr().Убедитесь, что в вашем словаре сопоставления у вас нет скобок для методов (например, {'Method 1': self.method_one()...).Если вы сделаете это, chosen_method будет равно тому, что возвращает этот метод.

...