Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 LPTHW Ex 43关于使用自助服务的查询_Python 2.7_Oop - Fatal编程技术网

Python 2.7 LPTHW Ex 43关于使用自助服务的查询

Python 2.7 LPTHW Ex 43关于使用自助服务的查询,python-2.7,oop,Python 2.7,Oop,从中,我对下面的代码的作用有点困惑。下面几行代码到底是做什么的 这条线, current_scene = self.scene_map.next_scene(next_scene_name) 我相信这是使用字典中的CentralCorridor键从CentralCorridor()的值中得到的。所以它看起来像这样: current_scene = self.scene_map.CentralCorridor() self.scene\u映射的具体功能是什么 这条线, return self.

从中,我对下面的代码的作用有点困惑。下面几行代码到底是做什么的

  • 这条线,

    current_scene = self.scene_map.next_scene(next_scene_name)
    
    我相信这是使用字典中的
    CentralCorridor
    键从
    CentralCorridor()的值中得到的。所以它看起来像这样:

    current_scene = self.scene_map.CentralCorridor()
    
    self.scene\u映射的具体功能是什么

  • 这条线,

    return self.next_scene(self.start_scene)
    
    为什么需要在
    下一次返回之前指定
    self
    ?为什么不能是这样呢

    return next_scene(self.start_scene)
    
  • 发动机缸体

    class Engine(object):
    
        def __init__(self, scene_map):
            self.scene_map = scene_map
    
        def play(self):
            current_scene = self.scene_map.opening_scene()
            last_scene = self.scene_map.next_scene('finished')
            print "K Engine current_scene", current_scene
            print "K Engine last_scene", last_scene
    
            while current_scene != last_scene:
                next_scene_name = current_scene.enter()
                current_scene = self.scene_map.next_scene(next_scene_name)
                print "K Engine next_scene_name", next_scene_name
    
            # be sure to print out the last scene
            current_scene.enter()
    
    class Map(object):
    
        scenes = {
            'central_corridor': CentralCorridor(),
            'laser_weapon_armory': LaserWeaponArmory(),
            'the_bridge': TheBridge(),
            'escape_pod': EscapePod(),
            'death': Death(),
            'finished': Finished(),
        }
    
        def __init__(self, start_scene):
            self.start_scene = start_scene
    
        # For the key "scene_name", get its value from scenes dictionary located in Map class.
        def next_scene(self, scene_name):
            val = Map.scenes.get(scene_name)
            print "K Map val", val
            return val
    
        def opening_scene(self):
            print "K Map opening_scene", self.next_scene(self.start_scene)
            return self.next_scene(self.start_scene)
    
    a_map = Map('central_corridor')
    a_game = Engine(a_map)
    a_game.play()
    
    地图块

    class Engine(object):
    
        def __init__(self, scene_map):
            self.scene_map = scene_map
    
        def play(self):
            current_scene = self.scene_map.opening_scene()
            last_scene = self.scene_map.next_scene('finished')
            print "K Engine current_scene", current_scene
            print "K Engine last_scene", last_scene
    
            while current_scene != last_scene:
                next_scene_name = current_scene.enter()
                current_scene = self.scene_map.next_scene(next_scene_name)
                print "K Engine next_scene_name", next_scene_name
    
            # be sure to print out the last scene
            current_scene.enter()
    
    class Map(object):
    
        scenes = {
            'central_corridor': CentralCorridor(),
            'laser_weapon_armory': LaserWeaponArmory(),
            'the_bridge': TheBridge(),
            'escape_pod': EscapePod(),
            'death': Death(),
            'finished': Finished(),
        }
    
        def __init__(self, start_scene):
            self.start_scene = start_scene
    
        # For the key "scene_name", get its value from scenes dictionary located in Map class.
        def next_scene(self, scene_name):
            val = Map.scenes.get(scene_name)
            print "K Map val", val
            return val
    
        def opening_scene(self):
            print "K Map opening_scene", self.next_scene(self.start_scene)
            return self.next_scene(self.start_scene)
    
    a_map = Map('central_corridor')
    a_game = Engine(a_map)
    a_game.play()
    
    第一个问题 我认为,在阅读完类的实现之后,最好的方法是从执行开始的末尾开始:

    a_map = Map('central_corridor')
    a_game = Engine(a_map)
    a_game.play()
    
    因此,
    a_-map
    map
    的一个实例,并获取存储在
    self.start_-scene
    中的
    “中央走廊”
    (请参见
    map
    初始化()。接下来,
    a\u game=Engine(a\u map)
    创建一个
    Engine
    的实例,将此实例
    a\u map
    交给您。它存储在
    self.scene\u map
    中(请参见
    引擎的
    初始化()。在此实例上调用
    play()
    ,最后会出现以下代码行:

    current_scene = self.scene_map.next_scene(next_scene_name)
    
    这意味着:

    current_scene = CentralCorridor()
    
    因为它通过
    Map
    next\u scene
    方法,使用
    Map
    中的字典
    场景
    检索
    CentralCorridor
    的实例

    只能通过类
    Map
    或该类的实例访问方法
    next\u scene()。在
    Engine
    中,这样的实例存储在
    self.scene\u map
    中。因此,您需要使用
    self.scene\u map.next\u scene()
    。只需使用
    next\u scene(next\u scene\u name)
    就会出现
    namererror
    ,因为没有定义这样的函数。同样,类中的方法在整个模块中不可见。它们只能通过类或实例进行访问

    第二个问题 当这条线工作时:

    return self.next_scene(self.start_scene)
    
    此行不起作用:

    return next_scene(self.start_scene)
    

    因为方法
    next\u scene
    是在类
    Map
    中定义的。它不是全局模块空间中的正常函数。您可以通过类
    Map.next\u scene(一个\u Map,'name\u of \u scene')
    (不经常执行)调用它,也可以通过实例
    a\u Map.next\u scene('name\u of \u scene')
    self
    代表任何实例。因此,在本例中,您调用
    a\u map.next\u scene('name\u of\u scene')

    嗨,迈克·穆勒,非常感谢你的快速回复。我想澄清以下几点。当您说“它存储在self.scene\u map中”时。里面到底储存了什么?这会是“中央走廊”吗?我仍然难以理解第一个问题。你能解释一下为什么
    current\u scene=next\u scene(next\u scene\u name)
    不起作用吗?
    next\u scene(next\u scene\u name)
    是否已从字典中检索到
    CentralCorridor()
    ?前面的附加
    self.scene\u map
    的用途是什么。因为没有函数
    next\u scene()
    ,所以在
    map
    中只有一个具有此名称的方法。要在
    引擎
    中访问此方法,您需要有
    映射
    的实例,即
    引擎
    中的
    self.scene\u Map
    。看到我更新的答案。嗨,马克,非常感谢你的详细回复。非常感谢你的意见。整个周末都在为这件事苦苦挣扎。这终于有道理了!再次感谢。