Python OOP:字典中的函数不会影响类实例变量

时间:2013-06-07 03:27:33

标签: python oop dictionary

我是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()而不是动物类。

在以这种方式调用函数时,如何改变动物的健康状况,我有点失落。我是否必须以某种方式利用超级电话?

编辑澄清语法

2 个答案:

答案 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()