我一直在为这个问题疯狂,并且无法弄清楚发生了什么。
正如您在我的Display.py文件中看到的那样,我试图导入一个名为“位置”的课程。来自我的gameworld.py文件。
然而,每当我尝试运行游戏时,都会收到错误消息,说明位置未定义。'发生什么事会导致这种情况发生?
为什么完全相同的导入在一个文件中工作但不在一个文件中?
Display.py
from gameworld import * #I've also tried importing Location directly
screenSize(1500, 800)
bgLocation = Location('introd')
def bgChange():
bg = bgLocation.room.background
setBackgroundImage(bg)
updateDisplay()
gameworld.py
from Display import *
from output import *
class Room:
def __init__(self, name, description, exits, actions, roominv, roomkey, lock, background):
self.name = name
self.description = description
self.exits = exits
self.actions = actions
self.roominv = roominv
self.roomkey = roomkey
self.lock = lock
self.background = background
class Player:
def __init__(self, name, health):
self.name = name
self.health = health
class Location:
def __init__(self, room):
self.room = world[room]
def travel(self, direction, bag):
if direction not in self.room.exits:
self.no_exit()
else:
self.set_new_room_name(direction, bag)
对于上下文,导入在下面的文件中正常工作!有什么不同?
from gameworld import *
from Display import *
from output import *
from audio import *
def main():
player = Player("Jeff", 100)
bag = Bag([])
location = Location('introd')
command = ' '
while True:
command = textBoxInput(wordBox)
if command in location.room.exits:
location.travel(command, bag)
答案 0 :(得分:3)
在Python中,def,class和import之类的东西也是语句。
模块在导入期间执行,并且在执行def(或class)语句之前,新函数和类不会出现在模块的命名空间中。
如果您正在进行递归导入,这会产生一些有趣的影响。
考虑一个导入模块Y的模块X,然后定义一个名为spam的函数:
# module X
import Y
def spam():
print "function in module x"
如果从主程序导入X,Python将加载X的代码并执行它。当Python到达导入Y语句时,它会加载Y的代码,然后开始执行它。
目前,Python已在sys.modules中为X和Y安装了模块对象。但是X还没有任何东西; def垃圾邮件声明尚未执行。
现在,如果Y导入X(递归导入),它将返回对空X模块对象的引用。任何在模块级别访问X.spam函数的尝试都将失败。
# module Y
from X import spam # doesn't work: spam isn't defined yet!
请注意,您不必使用from-import来解决问题:
# module Y
import X
X.spam() # doesn't work either: spam isn't defined yet!
要解决此问题,要么重构程序以避免循环导入(将内容移动到单独的模块通常会有帮助),要么将导入移动到模块的末尾(在这种情况下,如果将导入Y移动到末尾)模块X,一切都会好起来的。)
希望这有帮助。