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 так что это означает, что вы не создаете экземпляр, а получаете ссылку на этот класс.

Другие вопросы по тегам