AttributeError:'模块'对象没有属性
我有两个python模块:
a.py
import b def hello(): print "hello" print "a.py" print hello() print b.hi()
b.py
import a def hi(): print "hi"
当我运行a.py
,我得到:
AttributeError: 'module' object has no attribute 'hi'
错误是什么意思? 我如何解决它?
你有相互的顶级import,这几乎总是一个坏主意。
如果你真的必须在Python中进行相互导入,那么这样做的方法是在一个函数中导入它们:
# In b.py: def cause_a_to_do_something(): import a a.do_something()
现在a.py可以安全地import b
而不会导致问题。
(乍一看, cause_a_to_do_something()
可能会是非常低效的,因为每次调用它时都会import
,但事实上导入工作只能在第一次完成,第二次和后续导入模块时,快速操作。)
我也看到这个错误时,无意中命名一个模块与一个标准的Python模块相同的名称。 例如我有一个叫做commands
的模块,它也是一个Python库模块。 事实certificate,由于在本地开发环境中正常工作,因此难以追查,但在Google App Engine上运行时,指定的错误失败。
问题是模块之间的循环依赖。 a
importb
和b
importa
。 但其中之一需要首先加载 – 在这种情况下python结束了初始化模块之前b
和b.hi()
不存在,当你尝试访问它在a
。
我通过引用一个以错误方式导入的枚举来得到这个错误,例如:
from package import MyEnumClass # ... # in some method: return MyEnumClass.Member
正确导入:
from package.MyEnumClass import MyEnumClass
希望能帮助别人
我遇到这个错误,因为这个模块并没有被导入。 代码看起来像这样:
import ab, ac # ... something(ab) something(ac) something(ad) # My addition, which failed.
最后一行导致了一个AttributeError
。 原因是我没有注意到( ab
和ac
)的子模块是明确导入的,并且假定import
语句实际上导入a
。