Python 在模块中导入模块时出现Web.py name错误

Python 在模块中导入模块时出现Web.py name错误,python,python-2.7,import,module,web.py,Python,Python 2.7,Import,Module,Web.py,我正在使用python 2.7.3上的web.py创建一个web应用程序。 我有以下文件夹结构: start_app.py /app __init__.py /models __init__.py ActionModel.py AreaModel.py /controllers __init__.py world.py /views 每当我使用python start_app.py新启动应用程序并访问world

我正在使用python 2.7.3上的web.py创建一个web应用程序。 我有以下文件夹结构:

start_app.py
/app
   __init__.py
   /models
      __init__.py
      ActionModel.py
      AreaModel.py
   /controllers
      __init__.py
      world.py
   /views
每当我使用
python start_app.py
新启动应用程序并访问
world/around
时,我都会遇到以下错误

<type 'exceptions.ImportError'> at /world/surrounding
cannot import name AreaModel
Python  /home/dev/app/models/ActionModel.py in <module>, line 13
Web     GET http://localhost:5000/world/surrounding

不过,我不知道这应该如何解决我的导入问题。

眼前的问题

不能从文件夹导入,但可以从包导入。您可以通过向任何文件夹中添加
\uuuuu init\uuuuuu.py
文件将其转换为包:

start_app.py
/app
   __init__.py
   /models
      __init__.py
      ActionModel.py
      AreaModel.py
   /controllers
      __init__.py
      world.py
   /views
      __init__.py
我猜
ActionModel.py
包含一个同名的类。如果是这样,我建议将文件重命名为
actionmodel.py
,以区别于类

循环导入

“循环进口”是一种好做法吗?还是有更好的办法 如何做到这一点

这不仅是不好的做法,而且根本不起作用。有两种方法可以解决这个问题,这主要取决于您正在尝试做什么:

a。在
AreaModel
中,导入
ActionModel
模块,然后通过属性查找引用要在其中使用的任何内容,反之亦然:

#areamodel.py
导入操作模型
def foo():
action=actionmodel.actionmodel(…)
只要引用在类或函数定义内,它就只会在运行时发生,而不会在导入期间发生,因此避免了循环引用

b。将
模型
变成一个模块,并将
动作模型
区域模型
代码放在其中

c。将
ActionModel
AreaModel
的共享代码/功能移动到它们都从中导入的基本模块中

d。让您的
ActionModel
类(或其他任何类)接受类作为输入,然后在
world.py
中将
AreaModel
传递给它(与
AreaModel
相同)。这样,
ActionModel
就不需要包含对
AreaModel
的引用,它只需要知道如何处理它:

#actionmodel.py
类ActionModel(对象):
定义初始化(arg1、arg2、区域类):
self.area=area_class()
#areamodel.py
类别模型(对象):
定义初始化(操作类):
self.action=action\u class()
#world.py
从actionmodel导入actionmodel
从areamodel导入areamodel
action=ActionModel('foo','bar',AreaModel)
面积=面积模型(ActionModel)
这就是所谓的对象合成。

我有init.py文件,所以这不是问题所在。无论如何,谢谢你指出这一点。我添加了它们。
start_app.py
/app
   __init__.py
   /models
      __init__.py
      ActionModel.py
      AreaModel.py
   /controllers
      __init__.py
      world.py
   /views
      __init__.py