2011-07-07 112 views
3

我刚刚学习Python作为我的第一种编程语言,并且通过了this online book。我的问题涉及在该页面上找到的练习。我很难理解游戏方法在课堂上的作用。它如何访问所有其他方法? getattr在这个循环中如何运作?感谢帮助!帮助:Python while while循环内部类

这里是那些宁愿不离开页面的方法:

def play(self): 
    next = self.start 

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

你真的在学习Python这个难题。 ;-)我建议使用官方的[教程](http://docs.python.org/tutorial/)。 – Keith

+1

@Keith我不同意。困难的方式更容易;)。 –

回答

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_gameplay()方法。不在Game,但在a_game。因此,当该方法运行时,它可以通过self(这看起来像一个常规参数)这个词访问a_game的所有属性。

这是下一个运行

next = self.start 

self.start__init__()定义,并且是等于 “central_corridor”。所以现在,next是“central_corridor”。
我们进入while True:循环,打印一些hypens,并调用getattr()
getattr()至少需要两个参数。第一个是对象的intsance,在这种情况下self,以及第二个是该实例的属性的名称。在这种情况下"central_corridor"
因此,getattr寻找称为“central_corridor”的自我属性,并找到它并返回它。现在,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的艰辛路!

+0

完美的解释!这清除了我不确定的事情。返回的值将返回到下一个。感谢您花时间详细解释。 – user832799

+0

@用户不客气:)。我很高兴它有帮助。 –

0

GETATTR是从Python中的内置功能。 play方法是属于类Game的方法。

虽然True表示循环一直持续到您打断它。

你还不明白什么?

编辑:免疫球蛋白创建一个新的游戏:g = Game() 那么你可以调用play方法:g.play(),这是玩(个体经营)表示,你也可以这样调用它:Game.play(g),而不是共同。

EDIT2:阅读更多关于GETATTR功能here

+0

嗯,我该怎么解释。我明白你说了什么,但我相信这是我的问题。当Game()第一次运行时,我得到了它,它通过__init__,然后使用central_corridor运行的play()方法。我不明白的是,在方法结束时,当它返回'something'时,这个'something'会返回到什么地方,并且这个goto在仍然在运行的循环内部转到哪里?我猜如何循环允许访问所有的方法?希望这是明确的....我只学习了一个星期的编程:D – user832799

+0

所以如果我正确地理解了这个问题,这个play函数在没有指定返回类型时返回None,while循环一直运行直到你中断它在每次迭代时都会打印“---------”,为变量空间获取新值,并在该值旁边设置。 –

+0

请记住,这不是一个程序,这是一个类定义,所以当您运行空闲或任何其他IDE时调用这些方法,并创建一个游戏实例并调用其中的方法。 –

1

到这里看看:

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

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

1

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

编辑:

GETATTR()是获得属性的值,而不是该属性本身。该属性的值是... 滚筒无论属性如何返回。这要求属性完全执行才能获取值。然后,将属性'next'更改为现在执行的属性的返回 ...然后运行'next'以便通过getattr()获取它的值!重复,直到“死亡”或其他,这打破了循环。

我现在明白了。

+0

您正在回答一个问题,说“我会稍后回答。”真? –

+0

这是我理解失败的地方...... – user832799

+0

好的,只是测试了一些想法,我发现一旦代码命中返回它然后将退出循环。因此,如果例如我在'central_corridor'之后的第一个选项中返回“死亡”,那么它将退出循环。这是如何返回'死亡'的价值,然后习惯继续死亡的方法? – user832799

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 

所以基本上分配给另一个变量的变量只是引用同一个对象,而不会改变任何事情。