pythonoop:字典中的函数不影响类实例变量

2024-06-26 08:22:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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()函数的{}显然是指{},而不是动物类。在

当我以这种方式调用函数时,我有点不知所措,不知道该如何改变动物的健康状况。我一定要利用超级班级电话吗?在

编辑:澄清语法


Tags: 函数selfactionsdefsleepother动物health
2条回答

您不需要将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)

输出:

^{pr2}$

如前所述,您在self.health = RESTORED_HEALTH中输入+=
您还错过了self.initializeSleep()中的self

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")()

现在,让我们来看看这本书- 由于您将实际的“sleep”函数定义为一个嵌套函数,它将“看到”存在于initializeSleep()的调用中的“self”变量-这意味着您所做的应该只是工作-只要您通过在self.前缀来修复对initializeSleep()的调用,如下所示:

^{pr2}$

把“self”参数从实际的“sleep”函数中去掉-它不需要它, 因为它将“看到”封闭范围中的非局部self变量:

def initializeSleep(self):
    RESTORED_HEALTH = 20
    # other constants

    def sleep():
        self.health = RESTORED_HEALTH
        # utilize other constants

    return sleep

(在initializeSLeep中定义的其他常量也将在sleep中作为非本地变量可见)

相关问题 更多 >