我是Python的新手但是为了爱好而编写程序,所以我对OOP和计算机编程有一定的了解。我已经开始研究一个简单的动物模拟器。在异教徒移动中,我试图将动物的所有“动作函数”存储在字典中,以便每个函数都可以通过字符串访问。例如,dict['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
然后,动物处理程序将执行以下几行:
for animal in animalList:
animal.actions['SLEEP']()
当我调用睡眠功能时,我当然希望动物的健康状况增加20。相反,没有任何反应。经过一些研究和实验,我发现传递给self
函数的sleep()
显然是指initializeSleep()
而不是动物类。
在以这种方式调用函数时,如何改变动物的健康状况,我有点失落。我是否必须以某种方式利用超级电话?
编辑澄清语法
答案 0 :(得分:4)
Python做了一些操作,以便在类体中定义的函数实际上表现为“方法” - 因此,获取自动添加的“self”参数。
不难理解如何完成 - 并在计划中为显式字典模拟它 - 但首先,请考虑您可以使用字符串检索方法名称,而不必将其存储在字典中计划 - 你可以简单地做:
class Animal(object):
...
def sleep(self, ...):
...
my_cow = Animal()
function = getattr(my_cow, "sleep")
function ( )
# and of course, the two preceeding lines can be in a single expression:
getattr(a, "sleep")()
现在,让我们来看看代名词 -
因为你将实际的“睡眠”功能定义为嵌套函数,它将“看到”调用initializeSleep()
时存在的“自”变量 - 这意味着你正在做的事情应该只是工作 - 就像soons一样您通过在initializeSleep()
前添加self.
前缀来修正def initializeAnimal(self):
self.actions['SLEEP'] = self.initializeSleep() # add sleep function
的来电,如:
self
从实际的“睡眠”功能中删除“self”参数 - 它不需要它,
因为它将“看到”封闭范围内的非局部def initializeSleep(self):
RESTORED_HEALTH = 20
# other constants
def sleep():
self.health = RESTORED_HEALTH
# utilize other constants
return sleep
变量:
{{1}}
(在initializeSLeep中定义的其他常量也将在sleep中作为非局部变量显示)
答案 1 :(得分:1)
您无需将self
属性放入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.health += RESTORED_HEALTH
# utilize other constants
return sleep
a = Animal()
print(a.health)
a.actions['SLEEP']()
print(a.health)
输出:
100
120
如上所述,您在+=
中填写了self.health = RESTORED_HEALTH
您还错过了self
self.initializeSleep()