Python: как создать объект класса с помощью Importlib
Я знаю, что похожий вопрос задавался / отвечался несколько раз. Но, пожалуйста, читайте дальше..
Я пытаюсь создать класс из строкового значения, как описано в " Преобразование строки в объект класса Phython" в Python 3.6.
utils.py
class Foo(object):
def __init__(self):
print("In the constructor of Foo")
def What(self):
print("so what ... ")
class FooParam(object):
def __init__(self, v):
self.value = v
print("In the constructor of FooParam")
def What(self):
print("Value=" % self.value)
print("So what now ...")
welcome.py
def TEST1():
m = importlib.import_module("utils")
c = getattr(m, "Foo")
c.What()
if __name__ == '__main__':
TEST1()
ошибка
TypeError: What() missing 1 required positional argument: 'self'
Так что я делаю не так?
Также, как я могу создать объект "FooParam" и передать значение конструктору.
Спасибо вам всем...
РЕДАКТИРОВАТЬ Ключевая деталь здесь, которая отличает это от упомянутых повторяющихся элементов, состоит в том, что "getattr" возвращает только "имя класса", а не "Объект" указанного класса, как я предполагал. Я пришел из мира C++ и предположил, что функция также принимает аргументы конструктора и возвращает объект упомянутого класса. Но это не так.
2 ответа
Я подозреваю, что c это класс Foo, но не экземпляр класса.
Это эквивалентно простому звонку
Foo.what()
Вот почему я не определен!
В то время как вы хотите создать экземпляр класса (присвоив ему свойство self), затем вызвать его метод, т.е.
foo_instance = Foo()
foo_instance.What()
так что попробуйте заменить c.What() на..
foo_instance = c()
foo_instance.What()
для FooParam:
#import the class FooParam
c = getattr(m, "FooParam")
#create an instance of the class, initializing its values (and self)
fooparam_instance = c(3.14)
#call its method!
fooparam_instance.What()
в целом я бы переименовал переменную c в что-то вроде foo_import и fooparam_import соответственно:)
После того, как вы импортируете модуль, просто получите доступ к переменной, которую вы сохранили в импортированном модуле:
m = importlib.import_module("utils")
foo = m.Foo()
foo.What()
import_module
выполняет те же шаги, что и import
,
это c = getattr(m, "Foo")
строка кода эквивалентна f = Foo
так что это означает, что вы не создаете экземпляр, а получаете ссылку на этот класс.