在 python 中,将函数用作类的属性的正确语法是啥? [关闭]

Posted

技术标签:

【中文标题】在 python 中,将函数用作类的属性的正确语法是啥? [关闭]【英文标题】:In python, what is the proper syntax for using a function as an attribute of a class? [closed]在 python 中,将函数用作类的属性的正确语法是什么? [关闭] 【发布时间】:2021-06-02 22:14:27 【问题描述】:

我是编程新手,我正在尝试通过在 pygame 中制作一个简单的游戏来学习。我将使用很多可点击的按钮,所以我决定为它们创建一个类。作为属性,我希望它们有一个 pygame.Rect 对象(告诉我将它们放在屏幕上的哪个位置)、一个 pygame.Surface 对象(告诉我它应该是什么样子)和一个我称之为“动作”的函数在下面的代码中,每当单击按钮时都会调用它。这是我的尝试:

class Button:
    def __init__(self, rect, surf, action = None):
        self.rect = rect
        self.surf = surf
        self.action = action
        
    def draw(self, surf):
        surf.blit(self.surf, self.rect)

    def click(self, event):
        if event.type == pygame.MOUSEBUTTONUP:
            mouse_pos = pygame.mouse.get_pos()
            if self.rect.collidepoint(mouse_pos) and self.action != None:
                self.action()

例如,如果我想制作一个将某个全局变量“money”加 1 的按钮,那么我可以这样做

def change_money():
    global money
    money = money + 1

#some code here to define button_rect, button_surf

button = Button(button_rect, button_surf, change_money)

这可以完成工作,但非常不令人满意,因为如果我想制作一个新的按钮来增加 2 的钱,我必须定义一个新函数 change_money_2() 然后再做 button2 = Button(button2_rect, button2_surf, change_money_2)

我尝试了幼稚的方法:

def change_money(delta):
    global money
    money = money + delta

button2 = Button(button_rect, button_surf, change_money(2))

但这不起作用。

问题 1 将函数作为类属性传递的正确语法是什么?特别是,如果函数有输入,你会怎么做?

问题 2 理想情况下,我希望不必为简单操作 money = money + 1 定义新函数。有没有办法将这样的函数作为类的属性传递而不必给它一个名字? (例如,button = Button(button_rect, button_surf, [money -> money + 1]) 之类的东西。

编辑1:感谢您使用lambda函数的建议;我不知道这些。有没有办法让 lambda 函数采用全局变量?天真的lambda global money : money = money + 2lambda : money = money + 2 似乎不起作用。我的直觉(基于 Rabbid76 的 reference)是这些 lambda 函数非常适合使用 return 语句“模仿”函数,但是如果我想模仿没有 return 语句的函数,比如 change_money()?

【问题讨论】:

lambda: change_money(2)?参见例如docs.python.org/3/tutorial/controlflow.html#lambda-expressions. 感谢您的回答。我可以向您推荐编辑 1 中的后续内容吗? 【参考方案1】:

使用lambda:

button2 = Button(button_rect, button_surf, change_money(2))

button2 = Button(button_rect, button_surf, lambda: change_money(2))

有没有办法让 lambda 函数接受一个全局变量?

不,您不能在 lambda 表达式中使用 global statement。 lambda 没有语句列表,它是一个表达式。

【讨论】:

感谢您的回答。我可以向您推荐 Edit1 中的后续内容吗? 无意添加后续问题。不,您不能在 lambda 表达式中使用 global 语句。 lambda 没有语句列表,它是一个表达式。只需使用change_money 函数。你问题中的假设是错误的。 lambda 不需要返回值。 change_money 没有返回值。

以上是关于在 python 中,将函数用作类的属性的正确语法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象属性定义为函数 = 正确的语法?

Python中类的声明,使用,属性,实例属性,计算属性及继承,重写

如何将 Python 2 unicode() 函数转换为正确的 Python 3.x 语法

在 HTML 属性中调用带有字符串参数的函数的正确语法是啥? [复制]

使用 boost::python 从 c++ 函数访问大表

类的封装