Я столкнулся с какой-то странной проблемой, и в моих поисках я не обнаружил подобных проблем; что, вероятно, означает, что проблема явно очевидна, и я ее просто не вижу. У меня есть модуль класса, называемый 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'. Проблема в том, что я не знаю почему.
Почему этот метод динамического импорта влияет на способ создания экземпляра объекта? И что я могу сделать, чтобы исправить это?
Я искал ответы с высоким и низким уровнем поиска, так что это, вероятно, что-то прямое, что я забыл или просто не понимаю.
Любая причина вы не используете [ 'importlib' модуль] (http://docs.python.org/2/library/importlib. html) вместо этого? –
'myobj = getattr (module," moduleclass ")' возвращает класс, а не экземпляр. try: 'myobj = getattr (module," moduleclass ")()' – shx2
@MP - вы видите, у меня была такая же проблема с importlib. Это также должно исправить это. – Raceyman