NameError:名称'MainCorridor'未定义

2024-10-01 04:52:18 发布

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

我在学习LPTHW,一直在做我自己的游戏。你知道吗

class Engine(object):

    location_dict = {
        'main_corridor': MainCorridor(),
    }

    def goto(self, location):
        return Engine.location_dict.get(location).start()

    def test(self):
        print "Calling Engine() from MainCorridor()"    


class MainCorridor(object):

    def __init__(self):
        self.engine = Engine()

    def start(self):
        self.engine.test()



game = Engine()
game.goto('main_corridor')

有人能给我一些建议吗?非常感谢谢谢

以下是错误消息:

Traceback (most recent call last):
    File "ex45_game.py", line 1, in <module>
        class Engine(object):
    File "ex45_game.py", line 4, in Engine
        'main_corridor': MainCorridor()
NameError: name 'MainCorridor' is not defined

Tags: testselfgameobjectmaindeflocationstart
2条回答

出现此错误是因为location_dict是类变量。在定义location_dict时,您试图将MainCorridor对象分配给location_dict,但这是在定义MainCorridor之前发生的,因此您会收到错误,因为它还不存在。如果在实例而不是类上定义location_dict,则不会得到这个结果(见下文)。你知道吗

class Engine(object):
    def goto(self, location):
        return Engine.location_dict.get(location).start()
    def test(self):
        print "Calling Engine() from MainCorridor()"
    def __init__(self):
        self.location_dict = {'main_corridor': MainCorridor(),}


class MainCorridor(object):
    def __init__(self):
        self.engine = Engine()
    def start(self):
        self.engine.test()

另一方面,由于在对象之间来回切换,当我运行带有这些修改的代码时,我得到了一个RuntimeError: maximum recursion depth exceeded。当您创建Engine的实例时,就会发生这种情况。请注意,当您创建Engine时,它会创建一个MainCorridor并将其放入dict。但是当您创建MainCorridor时,它会创建一个Engine,它会创建一个MainCorridor并将其放入dict。但是当您创建MainCorridor时。。。你知道吗

我最近做了lpthw教程。Zed所做的是创建第三个类来映射游戏中的级别,这样就可以在其他类被定义之后实例化它们。这将修复“未定义”错误。你知道吗

但另一个问题是,您正在最后创建一个引擎对象:

game = Engine()

然后在初始化MainCorridor类时,创建一个单独的引擎对象:

class MainCorridor(object):

    def __init__(self):
        self.engine = Engine()

解决方案是仅在MainCorridor类中创建engine类:

class Engine(object):

    def test(self):
        print "Calling Engine() from MainCorridor()"    


class MainCorridor(object):

    def __init__(self):
        self.engine = Engine()

    def start(self):
        self.engine.test()


class Map(object):

    location_dict = {
        'main_corridor': MainCorridor(),
    }

    def goto(self, location):
        map = self.get_location(location)
        return map.start()

    def get_location(self, location):
        return self.location_dict[location]


game = Map()
game.goto('main_corridor')

但是这样,您在location目录中放置的每个location实例都将有自己唯一的引擎对象。你知道吗

为每个位置指定单个引擎对象可以做的是将'self'从引擎传递到map类,并让map类通过将相同的引擎对象传递到列表中的每个位置来实例化location\u dict:

class Engine(object):

    def __init__(self):
        self.map = Map(self)

    def test(self):
        print "Calling Engine() from MainCorridor()"    


class MainCorridor(object):

    def __init__(self, engine):
        self.engine = engine

    def start(self):
        self.engine.test()


class Map(object):

    def __init__(self, engine):
        self.location_dict = {
            'main_corridor': MainCorridor(engine),
        }

    def goto(self, location):
        map = self.get_location(location)
        return map.start()

    def get_location(self, location):
        return self.location_dict[location]


game = Engine()
game.map.goto('main_corridor')

相关问题 更多 >