我对Python不熟悉,但编写程序是出于业余爱好,所以我对OOP和计算机编程有一定的了解。我已经开始研究一个简单的动物模拟器。我试图将动物的所有“动作函数”存储在字典中,这样每个函数都可以通过一个字符串访问,这可能是一个异教徒的举动。例如,dict['SLEEP']()
调用sleep函数。在
我找不到我想要完成的事情的例子,坦白地说,我不知道如何明智地描述我的问题。请参见下面的基本代码:
class Animal:
def __init__(self):
self.health = 100
self.actions = {} # dictionary of functions
self.initializeAnimal()
def initializeAnimal(self):
self.actions['SLEEP'] = self.initializeSleep() # add sleep function
def initializeSleep(self):
RESTORED_HEALTH = 20
# other constants
def sleep(self):
self.health += RESTORED_HEALTH
# utilize other constants
return sleep
然后,驯兽师将按照以下路线执行操作:
^{pr2}$我当然希望动物的健康状况在睡眠功能被调用时增加20。相反,什么也没发生。经过一些研究和实验,我发现传递给sleep()
函数的{
当我以这种方式调用函数时,我有点不知所措,不知道该如何改变动物的健康状况。我一定要利用超级班级电话吗?在
编辑:澄清语法
您不需要将
self
属性放入sleep
函数中。完全可以这样做:
输出:
^{pr2}$如前所述,您在
self.health = RESTORED_HEALTH
中输入+=
。您还错过了
self.initializeSleep()
中的self
Python做了一些操作,以便在类主体中定义的函数实际上表现为“方法”—因此,可以授权地添加“self”参数。在
不难理解这是如何实现的,并按计划为显式字典模拟它,但首先,考虑到可以使用字符串检索方法名,而不必按计划将它们存储在字典中,您可以简单地执行以下操作:
现在,让我们来看看这本书- 由于您将实际的“sleep”函数定义为一个嵌套函数,它将“看到”存在于
^{pr2}$initializeSleep()
的调用中的“self”变量-这意味着您所做的应该只是工作-只要您通过在self.
前缀来修复对initializeSleep()
的调用,如下所示:把“self”参数从实际的“sleep”函数中去掉-它不需要它, 因为它将“看到”封闭范围中的非局部
self
变量:(在initializeSLeep中定义的其他常量也将在sleep中作为非本地变量可见)
相关问题 更多 >
编程相关推荐