帮助:Python内循环Class

时间:2011-07-07 04:10:11

标签: python

我只是学习Python作为我的第一门编程语言,并通过this online book。我的问题与该页面上的练习有关。我无法理解play方法在课堂上的运作方式。它是如何访问所有其他方法的? getattr如何在这个循环中运行?感谢帮助!

以下是那些不想离开页面的方法:

def play(self):
    next = self.start

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

5 个答案:

答案 0 :(得分: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()

调用play()中的a_game方法。不在Game,而在a_game。因此,当该方法运行时,它可以通过单词self(被视为常规参数)访问a_game的所有属性。

这是下次运行

next = self.start

self.start__init__()中定义,等于“central_corridor”。现在,next是“central_corridor” 我们输入while True:循环,打印一些超量,然后拨打getattr() getattr()至少需要两个参数。第一个是对象的intsance,在这种情况下是self,第二个是该实例的属性的 name 。在这种情况下"central_corridor"
所以getattr寻找一个名为“central_corridor”的self属性,然后找到它并返回它。现在,room等于self.central_corridor 接下来,运行next = room()。由于房间当前等于self.central_corridor,所以:

next = self.central_corridor()

实际上是在运行。

self.central_corridor()可以返回“死亡”,“laser_weapon_armory”或“central_corridor”中的一个。假设它返回“laser_weapon_armory”。现在next是“laser_weapon_armory”。我们回到循环的开头。我们再次打印一些连字符,得到一个名为“laser_weapon_armory”的属性,恰好是self.laser_weapon_armory,然后运行它。
self.laser_weapon_armory可以返回“the_bridge”或“death”。这一次让我们说它会回归“死亡”。现在next是“死亡”。我们回到循环的开头,打印一些超量,得到self.death,并运行它。

所有self.death都会打印self.quips中的随机字符串,然后是exit(1)。来自exit模块的sys函数就是这样做的。它终止了该计划。

这就是它。我希望这会有所帮助。

祝你好运学习Python!

答案 1 :(得分:1)

看看这里:

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

基本上getattr(self, next)要求self对象返回由next命名的属性。例如,如果next是“abc”,那就像调用self.abc

答案 2 :(得分:1)

虽然我不确定为什么,但很明显getattr()正在执行'next'中的任何值。最初它是'start',即'“central_corridor”。但是,在该函数完成并返回一个值之后,room()和getattr(self,next)之间的交互正在拾取该值并将相应的函数作为“next”执行。

编辑:

getattr()获取属性的值,而不是属性本身。无论属性返回,属性的值都是.... 鼓roll 。这需要完全执行属性才能获得值。然后,属性“next”被更改为现在执行的属性的 return ...然后运行“next”以通过getattr()获取它的值!重复,直到“死亡”或其他什么,这打破了周期。

我现在明白了。

答案 3 :(得分:0)

getattr是python的内置函数。 play方法是属于Game类的方法。

True表示循环一直持续到你打断它为止。

你不明白还有什么?

编辑:你创建了一款新游戏:g = Game() 那么你可以调用play方法:g.play(),这就是play(self)的意思,你也可以这样称呼它:Game.play(g),但这并不常见。

EDIT2:详细了解getattr函数here

答案 4 :(得分:0)

实际上非常简单。 :)

以这种方式思考。 next被分配了self.next的引用(地址)。所以当我们getaddr(self, next)时,由于下一个是self.next的引用,它实际上只是要求self.next的内存地址,这当然是self的属性,所以它有效。

我知道它看起来有点奇怪。

一个简单的例子:

>>> a = 'r'
>>> print '0x%x' % id(a)
0x7fbe99e204b8
>>> b = a
>>> print '0x%x' % id(b)
0x7fbe99e204b8

>>> class T(object): pass
... 
>>> foo = T()
>>> print '0x%x' % id(foo)
0x15c6bd0
>>> bar = foo
>>> print '0x%x' % id(bar)
0x15c6bd0
>>> bar = T()
>>> print '0x%x' % id(bar)
0x15c6b90

因此,基本上将变量分配给另一个变量只引用相同的对象,而不更改任何内容。