LPTHW Ex 43查询自我的使用

时间:2015-12-20 09:38:30

标签: python-2.7 oop

Learn Python the Hard Way开始,我对以下代码的作用感到有些困惑。以下几行代码究竟做了什么?

  1. 对于这一行,

    current_scene = self.scene_map.next_scene(next_scene_name)
    

    我相信这是使用字典中的CentralCorridor()键从central_corridor的值获得的。所以它看起来像这样:

    current_scene = self.scene_map.CentralCorridor()
    

    self.scene_map究竟做了什么?

  2. 对于这一行,

    return self.next_scene(self.start_scene)
    

    为什么有必要在self前面指定next_return?为什么不能如下呢?

    return next_scene(self.start_scene)
    
  3. 引擎块

    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()
    

1 个答案:

答案 0 :(得分:1)

第一个问题

我认为在读完类的实现后,最好的方法是从执行开始的那一步开始:

a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()

所以a_mapMap的一个实例,并'central_corridor'存储self.start_scene(请参阅__init__()的{​​{1}})。接下来,Map使a_game = Engine(a_map)的实例处理此实例Engine。它存储在a_map中(请参阅self.scene_map的{​​{1}})。在此实例上调用__init__()终于来到这一行:

Engine

这意味着:

play()

因为它通过current_scene = self.scene_map.next_scene(next_scene_name) 的方法current_scene = CentralCorridor() CentralCorridor中的字典scenes检索Map的实例}。

方法'central_corridor'只能通过类next_scene或此类的实例访问。在Map中,此类实例存储在next_scene()中。因此,您需要使用Map。只使用Engine会给你一个self.scene_map,因为没有定义这样的函数。同样,类中的方法在整个模块中都不可见。它们只能通过类或实例访问。

第二个问题

虽然这条线有效:

self.scene_map.next_scene()

此行不起作用:

next_scene(next_scene_name)

因为方法NameError是在类return self.next_scene(self.start_scene) 中定义的。它不是全局模块空间中的正常功能。您可以通过课程return next_scene(self.start_scene) (通常不会)或通过实例next_scene来调用它。 Map代表任何实例。因此,在这种情况下,请致电Map.next_scene(a_map, 'name_of_scene')