我浏览了 Learn python the hard way,我遇到了如下代码片段。但我不明白它背后是什么,一个函数基本上返回一个字符串,它的类有一个同名的函数。并且可以正常调用函数。 好吧,当您查看代码时,您就会明白我的意思。
代码:
from sys import exit
class Game(object):
def __init__(self, start):
self.start = start
def play(self):
next = self.start
while True:
print "\n--------"
room = getattr(self, next)
next = room()
def a1(self):
print "You are in a1, redirecting to a2"
return 'a2'
def a2(self):
print "You are in a2, exiting"
return 'death'
def death(self):
print 'You died'
exit(0)
a_game = Game('a1')
a_game.play()
请您参考如下方法:
您看到的是 getattr() 内置函数的结果。 Python 是一种高级语言,而且是一种解释型语言。由于 python 中的所有对象基本上都是以哈希表的形式在内存中构建的,因此 Python 具有相当大的 Reflection机制。
这意味着 Python 可以在运行时 检查和修改它自己的类和对象,其中一种方法是使用 getattr() 内置函数。 getattr 内置函数在第一个参数中检索成员的值,name 它在第二个参数。 getattr(x, "y") 与 x.y 基本相同,但 getattr 还允许使用更安全的方法,其中默认值可以是如果成员实际上不存在则给出:getattr(x, "y", "No such member")。如果 x 没有成员 y,则 x.y 将导致 AttributeError 异常。另一方面,gettattr(x, "y", "No such member") 将返回字符串“No such member”并且不会引发异常。
在您的情况下,这些方法作为字符串放置在 next 变量中,并通过放置在 room 中的 getattr() 内置函数进行访问.然后调用 room() 并返回下一个方法名称并将其存储到 next 中。这在 while 循环中重复,直到在 Game.death() 中调用 exit(0)。
您还应该看看 setattr() 和 hasattr()
