使用__import__时出现'没有属性'错误
我遇到了一个奇怪的问题,搜索了很多地方也没找到类似的情况;这可能意味着问题很明显,但我却没看出来。
我有一个叫做 modulefile.py 的类模块,放在一个叫 modulefolder 的文件夹里。这个 modulefile.py 的内容是:
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' 属性。问题是,我不知道为什么。
为什么这种动态导入的方法会影响实例化对象的工作方式?我该怎么解决这个问题呢?
我到处寻找答案,所以这可能是我忽略了的简单问题,或者是我不太理解的地方。
1 个回答
4
你在 test2.py
里没有创建你的类的实例:
myobj = getattr(module, "moduleclass")()