python3中的循环导入和类字段

2024-05-19 08:11:01 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我确实明白这个话题已经是老生常谈了,但是对于我所问的这个问题,我找不到答案。在

假设我们有一个非常简单的结构:两个文件,a.py和{},它们的内容是:

a.py

import b

class C:
    lal = 4

class A:
    kek = 12
    lol = b.B()

b.py

^{pr2}$

尝试运行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框架来说,这是一个特别重要的问题。当我有许多模型时,我尝试将它们分割成许多文件。在那里很容易得到循环输入。


Tags: 文件答案inpyimport内容line情况
2条回答

实际上@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

enter image description here

对于这个问题,解决方案是在类中导入一个模块或类,而不是在模块的顶部

按照你的例子

a.py

class C:
    lal = 4

class A:
    import b
    kek = 12
    lol = b.B()

b.py

^{pr2}$

或者

a.py

import b
class C:
    lal = 4

class A:

    kek = 12
    lol = b.B()

b.py

class B:
    import a
    aa = a.C() 

关于详细的information discussion

Python issue

相关问题 更多 >

    热门问题