为什么我不能导入这个类?我不知道它是如何进行循环导入

时间:2018-05-29 15:22:00

标签: python python-3.x class variables import

我一直在为这个问题疯狂,并且无法弄清楚发生了什么。

正如您在我的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)

1 个答案:

答案 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,一切都会好起来的。)

希望这有帮助。