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
。看到我更新的答案。嗨,马克,非常感谢你的详细回复。非常感谢你的意见。整个周末都在为这件事苦苦挣扎。这终于有道理了!再次感谢。