查看: 1547|回复: 4

AttributeError: 'module' object has no attribute 'hi'

[复制链接]

9

主题

74

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2018-9-18 15:02:33 | 显示全部楼层 |阅读模式
本帖最后由 蛋蛋超人 于 2018-9-18 15:46 编辑

我有两个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'
错误是什么意思?我如何解决它?
回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-18 15:04:06 | 显示全部楼层
文件有共同的顶级导入,这是一个坏操作。
如果你真的必须在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每次调用时都会执行,但实际上导入工作只在第一次完成。第二次和以后导入模块时,它是一个快速操作。 )
回复

使用道具 举报

11

主题

80

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2018-9-18 15:05:31 | 显示全部楼层
当我无意中命名一个与标准Python模块之一同名的模块时,我也看到了这个错误。例如,我有一个名为commands的模块,它也是一个Python库模块。这被证明很难跟踪,因为它在我的本地开发环境中正常工作,但在Google App Engine上运行时因指定的错误而失败。
回复

使用道具 举报

11

主题

63

帖子

159

积分

注册会员

Rank: 2

积分
159
发表于 2018-9-18 15:08:03 | 显示全部楼层
问题是模块之间的循环依赖性。a import b和b import a。但需要其中的一个首先装载
回复

使用道具 举报

10

主题

82

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2018-9-18 15:09:21 | 显示全部楼层
我通过引用以错误方式导入的枚举来获得此错误,例如:
from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member
正确导入:
from package.MyEnumClass import MyEnumClass
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表