Я не вижу проблемы, если только methodName
не является строкой. В этом случае getattr выполняет работу:
>>> class A:
... def func(self, a, b):
... return a + b
...
>>> a = A()
>>> getattr(a, 'func')(2, 3)
5
Если object
также является строкой, то это будет работать, используя globals или locals (но тогда у вас могут быть другие, более серьезные проблемы):
>>> getattr(locals()['a'], 'func')(2, 3)
5
>>> getattr(globals()['a'], 'func')(2, 3)
5
Редактировать : повторное разъяснение. Чтобы инициализировать объект на основе строки:
>>> class A:
... def __init__(self): print('a')
...
>>> class B:
... def __init__(self): print('b')
...
>>> clsStr = 'A'
>>> myObj = locals()[clsStr]()
a
Я не уверен, что это действительно то, что вам нужно, хотя ... если у вас не много разных классов, почему бы просто не выполнить сопоставление строк?
Другое редактирование : Несмотря на то, что вышеприведенное работает, вы должны серьезно подумать о том, чтобы воспользоваться решением, таким как Игнасио Васкес-Абрамс . Во-первых, сохраняя все возможные классы в dict
, вы избегаете странного поведения, которое может возникнуть в результате передачи неверного строкового аргумента, который просто совпадает с именем несвязанного класса в текущей области.