使用__import__时出现'没有属性'错误

3 投票
1 回答
980 浏览
提问于 2025-04-17 18:03

我遇到了一个奇怪的问题,搜索了很多地方也没找到类似的情况;这可能意味着问题很明显,但我却没看出来。

我有一个叫做 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")()

撰写回答