从Learn Python the Hard Way开始,我对以下代码的作用感到有些困惑。以下几行代码究竟做了什么?
对于这一行,
current_scene = self.scene_map.next_scene(next_scene_name)
我相信这是使用字典中的CentralCorridor()
键从central_corridor
的值获得的。所以它看起来像这样:
current_scene = self.scene_map.CentralCorridor()
self.scene_map
究竟做了什么?
对于这一行,
return self.next_scene(self.start_scene)
为什么有必要在self
前面指定next_return
?为什么不能如下呢?
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()
答案 0 :(得分:1)
我认为在读完类的实现后,最好的方法是从执行开始的那一步开始:
a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()
所以a_map
是Map
的一个实例,并'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')
。