【发布时间】:2017-08-11 11:40:30
【问题描述】:
好的,我明白这个话题已经过时了,但我找不到我所问的特定问题的答案。
假设我们有一个非常简单的结构:两个文件,a.py 和 b.py,它们的内容是:
a.py
import b
class C:
lal = 4
class A:
kek = 12
lol = b.B()
b.py
import a
class B:
aa = a.C()
尝试运行python b.py,我们得到:
Traceback (most recent call last):
File "b.py", line 1, in <module>
import a
File ".../a.py", line 1, in <module>
import b
File ".../b.py", line 3, in <module>
class B:
File ".../a.py", line 5, in A
aa = a.C()
AttributeError: module 'a' has no attribute 'C'
但是如果我们将import b 行AFTER 移动到C 类,脚本将启动并且不会产生错误。
我在 SO 的任何答案中都没有发现任何提及这一点。这里的问题是:为什么会发生这种情况以及如何避免这种情况?
这对于 Django 框架来说是一个特别重要的问题。当我有很多模型时,我会尝试将它们拆分为多个文件。在那里进行循环导入非常容易。
【问题讨论】:
-
我在这个领域没有受过多少教育,但我相信答案就在这里:docs.python.org/3/reference/import.html。我还建议使用“from module_x import class_y”而不是“import *”。避免这些问题有很大帮助。
-
在加载程序执行模块代码之前,该模块将存在于 sys.modules 中。这是至关重要的,因为模块代码可能(直接或间接)导入自身;预先将其添加到 sys.modules 可以防止最坏情况下的无限递归和最佳情况下的多次加载。
标签: python django python-3.x python-import