2013-03-05 4 views
2

Я столкнулся с какой-то странной проблемой, и в моих поисках я не обнаружил подобных проблем; что, вероятно, означает, что проблема явно очевидна, и я ее просто не вижу. У меня есть модуль класса, называемый modulefile.py, в папке с именем modulefolder. Вот modulefile.py:Ошибка «не имеет атрибута» с использованием __import__

class moduleclass(object): 
    def __init__(self): 
     self.parameter = 5 

Теперь в моем файле test1.py я делаю это:

from modulefolder.modulefile import moduleclass 
myobj = moduleclass() 
print myobj.parameter 

И это прекрасно работает - он выводит значение 5, как ожидалось.

Теперь моя проблема заключается в том, что в моем приложении я не буду знать modulefolder, modulefile и moduleclass до времени исполнения. Они будут предоставлены мне в строках. Так что я попробовал это, это test2.py:

module = __import__("modulefolder.modulefile", fromlist=["moduleclass"]) 
myobj = getattr(module, "moduleclass") 
print myobj.parameter 

И это не работает, я получаю сообщение об ошибке AttributeError: type object 'moduleclass' has no attribute 'parameter'.

Итак, это то, что меня озадачивает. В обоих test1.py и test2.py я изменил печать Постулаты на print dir(myobj) вместо этого, и я получаю это:

Для test1.py:

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'parameter'] 

Для test2.py

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

Таким образом, очевидно, что во втором методе импорта отсутствует атрибут 'parameter'. Проблема в том, что я не знаю почему.

Почему этот метод динамического импорта влияет на способ создания экземпляра объекта? И что я могу сделать, чтобы исправить это?

Я искал ответы с высоким и низким уровнем поиска, так что это, вероятно, что-то прямое, что я забыл или просто не понимаю.

+0

Любая причина вы не используете [ 'importlib' модуль] (http://docs.python.org/2/library/importlib. html) вместо этого? –

+0

'myobj = getattr (module," moduleclass ")' возвращает класс, а не экземпляр. try: 'myobj = getattr (module," moduleclass ")()' – shx2

+0

@MP - вы видите, у меня была такая же проблема с importlib. Это также должно исправить это. – Raceyman

ответ

4

Вы не создать экземпляр класса в test2.py:

myobj = getattr(module, "moduleclass")() 
+0

Ха! Понимаете, я ЗНАЮ, что это будет что-то простое! – Raceyman

Смежные вопросы