好吧,我确实明白这个话题已经是老生常谈了,但是对于我所问的这个问题,我找不到答案。在
假设我们有一个非常简单的结构:两个文件,a.py
和{
a.py
import b
class C:
lal = 4
class A:
kek = 12
lol = b.B()
b.py
尝试运行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'
如果
我在这里的任何答案中都没有提到这一点。这里的问题是:为什么会发生这种情况,如何逃避这种情况?在
对于Django框架来说,这是一个特别重要的问题。当我有许多模型时,我尝试将它们分割成许多文件。在那里很容易得到循环输入。
实际上@Kallz已经提供了正确的答案,但是你有点固执:)你正在创建循环引用,它将以无限循环结束。Python有一种机制,可以通过逐行执行来避免这种循环。首先打开b.py-它被加载到系统模块作为''uuu main\'u',并开始加载。加载时,它是“导入a”。所以它找的是“a”模块。它找到它并把它放入系统模块. 系统模块现在有''uumain\'u'和'a'。它开始在遇到“import b”的地方加载模块“a”。所以它找到“b.py”并将其放入系统模块. 现在你有了''uumain\'u','a','b',它开始加载'b',在遇到'import a'的地方-这一次模块'a'已经在里面了系统模块而且已经开始装载了!所以Python知道有什么可疑的事情发生了,你就变成了一个大麻烦。在
在python中,当您导入一个模块时,它首先导入在模块顶部定义的所有模块(如果模块不在其中)系统模块,然后导入将在中创建新的模块条目系统模块然后执行模块中的代码。在
所以,当您尝试在a.py中导入b.py模块时,它首先导入b.py中列出的所有模块都是a.py(import a),如果模块没有在中列出系统模块. 仍然没有完全执行模块b.py,所以没有将b.py模块添加到系统模块在
然后,它尝试导入a.py,并在a.py中首先导入所有在a.py中导入的模块都是b.py
这是一个基本循环a.py尝试导入b.py和b.py尝试导入a.py
对于这个问题,解决方案是在类中导入一个模块或类,而不是在模块的顶部
按照你的例子
a.py
b.py
^{pr2}$或者
a.py
b.py
关于详细的information discussion
Python issue
相关问题 更多 >
编程相关推荐