帮助:类内部的Python while循环

3 投票
5 回答
3276 浏览
提问于 2025-04-16 20:59

我正在学习Python,作为我的第一门编程语言,并且在看这本在线书。我遇到的问题和书中那个练习有关。我卡在了如何理解类里面的play方法。它是怎么访问其他方法的呢?在这个循环中,getattr是怎么工作的?非常感谢大家的帮助!

这里是那个方法,方便不想离开页面的人查看:

def play(self):
    next = self.start

    while True:
        print "\n--------"
        room = getattr(self, next)
        next = room()

5 个回答

1

看看这里:

http://effbot.org/zone/python-getattr.htm

简单来说,getattr(self, next) 是在让 self 这个对象返回一个叫做 next 的属性。举个例子,如果 next 是 "abc",那么这就相当于在调用 self.abc

1

虽然我不太确定为什么,但很明显,getattr()正在执行'next'里面的值。最开始它的值是'start',也就是'"central_corridor"。不过,当这个函数执行完并返回一个值后,room()和getattr(self, next)之间的互动就会获取到这个值,并执行对应的函数作为'next'。

编辑:

getattr()获取的是属性的值,而不是属性本身。属性的值就是……鼓声响起,属性返回的内容。这就需要这个属性完全执行才能得到值。然后,属性'next'会被改变,变成现在已经执行的属性的返回值……接着,'next'会被运行,以便通过getattr()获取它的值!这个过程会一直重复,直到出现'死亡'或者其他什么情况,才会打破这个循环。

我现在明白了。

2

我来给你解释一下这个是怎么工作的。
首先,运行的是:

a_game = Game("central_corridor")

这会调用 Game.__init__("central_corridor")
在这个 __init__ 方法里,self.start 被赋值为 "central_corridor"。
然后我们回到主程序。到现在为止,我们有了一个叫 a_game 的变量。这个变量其实是 Game 类的一个实例,它有一些属性,比如 a_game.starta_game.quipsa_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 顺利!

撰写回答