嗨,我正在写一个有 4个班级的保龄球比赛;每个都在自己的文件中,但都在同一目录/文件夹中;游戏(使用所有其他类),框架(使用回合,使用横滚), tenth_Frame(继承自框架),横滚(返回插针数)。我在我的tenth_Frame类中收到导入错误无法导入名称框。这也是我的第一个问题,我希望我包括了所有需要的东西:)
我试图弄清楚,读取了多个站点/ QnA,但找不到解决方案。我尝试更改导入,但是我设法得到的都是不同的错误消息(未定义框架)
Game.py
from Module_Frame import*
from Roll import*
from tenth_Frame import*
class Game:....
Module_Frame.py
from Game import*
from Roll import*
class Frame():
def __init__(self,game):
self._score=0
self._moves=Roll()
self.game=game
self.make_move()
Roll.py
import random
from Module_Frame import*
from Game import *
#from tenth_Frame import*
class Roll:...
tenth_Frame.py
from Module_Frame import Frame
class tenth_Frame(Module_Frame.Frame):
def __init__(self,game):
Frame.__init__(self,game)
self.__sum=0
...
我得到以下结果: ImportError:无法导入名称框
File "j:\Programme\Marius Programmierphase.22.07.19\bowling\Game.py", line 2, in <module>
from Module_Frame import*
File "j:\Programme\Marius Programmierphase.22.07.19\bowling\Module_Frame.py", line 2, in <module>
from Game import*
File "j:\Programme\Marius Programmierphase.22.07.19\bowling\Game.py", line 3, in <module>
from Roll import*
File "j:\Programme\Marius Programmierphase.22.07.19\bowling\Roll.py", line 5, in <module>
from tenth_Frame import*
File "j:\Programme\Marius Programmierphase.22.07.19\bowling\tenth_Frame.py", line 5, in <module>
class tenth_Frame(Module_Frame.Frame):
NameError: name 'Module_Frame' is not defined
因此,我还尝试了在第十个帧中将导入命令更改为:
1。)
from Module_Frame import Frame
class tenth_Frame(Frame):
ImportError: cannot import name Frame
2。)
import Module_Frame
class tenth_Frame(Frame):
NameError: name 'Frame' is not defined
3。)
import Module_Frame
class tenth_Frame(Module_Frame.Frame):
AttributeError: 'module' object has no attribute 'Frame'
4。)
from Module_Frame import *
class tenth_Frame(Module_Frame.Frame):
NameError: name 'Module_Frame' is not defined
我阅读了有关依赖项和许多其他错误的信息,但仍然没有得到我的错误(或无法检测到它)。
答案 0 :(得分:1)
所有模块之间都有循环依赖。我认为没有模块可以完全解析,并且模块内部的名称永远不会在其范围内声明。
编辑:当Python输入第一个文件时,它将尝试读取该文件。为简单起见,您有两种情况:Python找到指令并执行它(例如print("spam")
),或者Python找到定义(例如def f():
)。定义意味着将创建一个新名称并将其添加到找到的范围中,通常用于类和函数模块范围。完整阅读原始文件后,其他模块即可使用该模块的定义。
但是当遇到导入时,Python会切换到导入的文件,因为导入意味着在导入的文件中会找到一些理解原始文件所必需的名称。如果您有循环依赖,则永远不会读取文件的核心,将您保留在导入循环中,并且其他模块永远无法使用类,函数...的定义。
首先,您必须清除依赖项:Roll
导入Module_Frame
时,Module_Frame
无法导入Roll
。如果所有其他模块都需要类Games
,则它不能导入任何其他模块。但是,如果不完全了解所需内容,就很难提出文件结构。
然后使用:
import Module_Frame
class tenth_Frame(Module_Frame.Frame):
pass
或
from Module_Frame import Frame
class tenth_Frame(Frame):
pass
应该工作。