我只是学习Python作为我的第一门编程语言,并通过this online book。我的问题与该页面上的练习有关。我无法理解play方法在课堂上的运作方式。它是如何访问所有其他方法的? getattr如何在这个循环中运行?感谢帮助!
以下是那些不想离开页面的方法:
def play(self):
next = self.start
while True:
print "\n--------"
room = getattr(self, next)
next = room()
答案 0 :(得分:2)
我会尝试解释它是如何工作的。
首先,这是运行:
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()
调用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
因此,基本上将变量分配给另一个变量只引用相同的对象,而不更改任何内容。