我知道另一个关于模块相互导入的问题:(
基本上,我有一个文件main.py包含以下内容:class Main :
@staticmethod
def newMouton(mouton, i, j) :
listMoutons.append(mouton)
listMoutons.append(canvas.create_image(i * coteCarre, j * coteCarre + yMargin, img = imageMouton))
@staticmethod
def delMouton(mouton) :
moutonIndex = listMoutons.index(mouton)
canvas.delete(listMoutons[moutonIndex + 1]) #en ajoutant 1, on retrouve l'obj canvas image à supprimer
listMoutons.remove(mouton)
del listMoutons[moutonIndex:(moutonIndex + 2)]
from random import randint
from simulation import Simulation
#doing some other stuff such as creating the canvas variable and creating a Simulation instance
我有另一个文件simulation。py:
from main import Main
class Simulation:
def __init__(self) : self._moutons = []
def moutonMort(self, mouton) :
self._moutons.remove(mouton)
pos = mouton.getPosition()
Main.delMouton(mouton)
del mouton
当我尝试运行Main .py Python遇到错误时,它基本上说问题来自于我试图在Main中导入Simulation但随后我在Simulation中导入Main的事实。
为了更好地理解import是如何工作的,我读了这个问题当我运行main.py时,应该发生的是:
- Python从main中读取内容并定义main类
- Python读取import Simulation语句并通知Simulation尚未导入 所以Python执行模拟文件中的内容,从import Main语句开始
- 当Python读取该行时,它应该注意到Main类已被导入,因此它应该继续读取模拟文件中的内容(我错了吗?)
但事实并非如此:当Python读取模拟文件中的import Main语句时,它会尝试再次运行主文件中的内容,尽管它已经导入了
我希望我的解释清楚
在simulation.py中,您的意图是只导入Main,这是通过主模块,主模块还没有准备好,因为它仍然在导入仿真。这是一个循环引用的情况。在开始使用Python时,这是一个常见问题。你需要把你的模块引用排列成一个树状结构,不应该有反向引用。
不要觉得这是一个不方便的Pyton约束;它迫使您编写好的代码,并避免您陷入更多的麻烦。基本上,每个类或函数应该只关心一件事,与其他类和函数的耦合应该最小化。
看来你正在两个模块之间传播一个关注(模拟)。类的名称Main不是描述性的,我不确定它代表什么。但是我建议主模块依赖于Simulation, Simulation应该直接或通过Mouton类实现Mouton方法。