帮助:类内部的Python while循环
我正在学习Python,作为我的第一门编程语言,并且在看这本在线书。我遇到的问题和书中那个练习有关。我卡在了如何理解类里面的play方法。它是怎么访问其他方法的呢?在这个循环中,getattr是怎么工作的?非常感谢大家的帮助!
这里是那个方法,方便不想离开页面的人查看:
def play(self):
next = self.start
while True:
print "\n--------"
room = getattr(self, next)
next = room()
5 个回答
看看这里:
http://effbot.org/zone/python-getattr.htm
简单来说,getattr(self, next)
是在让 self
这个对象返回一个叫做 next
的属性。举个例子,如果 next
是 "abc",那么这就相当于在调用 self.abc
。
虽然我不太确定为什么,但很明显,getattr()正在执行'next'里面的值。最开始它的值是'start',也就是'"central_corridor"。不过,当这个函数执行完并返回一个值后,room()和getattr(self, next)之间的互动就会获取到这个值,并执行对应的函数作为'next'。
编辑:
getattr()获取的是属性的值,而不是属性本身。属性的值就是……鼓声响起,属性返回的内容。这就需要这个属性完全执行才能得到值。然后,属性'next'会被改变,变成现在已经执行的属性的返回值……接着,'next'会被运行,以便通过getattr()获取它的值!这个过程会一直重复,直到出现'死亡'或者其他什么情况,才会打破这个循环。
我现在明白了。
我来给你解释一下这个是怎么工作的。
首先,运行的是:
a_game = Game("central_corridor")
这会调用 Game.__init__("central_corridor")
。
在这个 __init__
方法里,self.start
被赋值为 "central_corridor"。
然后我们回到主程序。到现在为止,我们有了一个叫 a_game
的变量。这个变量其实是 Game
类的一个实例,它有一些属性,比如 a_game.start
、a_game.quips
、a_game.death()
等等。
接下来,运行的是:
a_game.play()
这会调用 a_game
中的 play()
方法。不是在 Game
中,而是在 a_game
中。因此,当这个方法运行时,通过 self
(它就像一个普通的参数)可以访问到 a_game
的所有属性。
接下来运行的是:
next = self.start
self.start
是在 __init__()
中定义的,值为 "central_corridor"。所以现在,next
的值是 "central_corridor"。
我们进入 while True:
循环,打印一些短横线,然后调用 getattr()
。
getattr()
至少需要两个参数。第一个是一个对象的实例,这里是 self
,第二个是这个实例的一个属性的名字。在这个例子中是 "central_corridor"
。
所以 getattr
会查找 self
中名为 "central_corridor" 的属性,并找到它,返回这个属性。现在,room
的值等于 self.central_corridor
。
接下来,运行 next = room()
。因为 room
目前等于 self.central_corridor
,所以实际上运行的是:
next = self.central_corridor()
这个代码。
self.central_corridor()
可以返回 "death"、"laser_weapon_armory" 或 "central_corridor" 中的一个。假设它返回了 "laser_weapon_armory"。现在 next
的值是 "laser_weapon_armory"。我们回到循环的开头。再次打印一些短横线,获取 self
中名为 "laser_weapon_armory" 的属性,这个属性就是 self.laser_weapon_armory
,然后运行它。
self.laser_weapon_armory
可以返回 "the_bridge" 或 "death"。这次假设它返回了 "death"。现在 next
的值是 "death"。我们回到循环的开头,打印一些短横线,获取 self.death
,并运行它。
所有 self.death
做的就是从 self.quips
中随机打印一条字符串,然后调用 exit(1)
。exit
函数来自 sys
模块,作用就是结束程序。
大概就是这样。我希望这能帮到你。
祝你学习 Python 顺利!