在python中,将函数用作类的属性的正确语法是什么?

在python中,将函数用作类的属性的正确语法是什么?,python,python-3.x,pygame,python-class,Python,Python 3.x,Pygame,Python Class,我是编程新手,我正试图通过在pygame中制作一个简单的游戏来学习。我将使用很多可点击的按钮,所以我决定为它们制作一个类。作为属性,我希望它们有一个pygame.Rect对象(告诉我在屏幕上放置它们的位置)、一个pygame.Surface对象(告诉我它应该是什么样子)和一个我在下面的代码中称为“action”的函数,每当单击按钮时都会调用该函数。以下是我的尝试: class Button: def __init__(self, rect, surf, action = None):

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

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\u money\u 2()
,然后执行
button2=button(button2\u rect,button2\u surf,change\u money\u 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\u surf,[money->money+1])

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

使用:

button2=按钮(按钮、按钮冲浪、换钱(2))

button2=按钮(按钮直接、按钮冲浪、lambda:换钱(2))

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


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

lambda:change\u money(2)
?请参见,例如。谢谢您的回答。我可以让您在编辑1中查看后续内容吗?谢谢您的回答。我可以让您在编辑1中查看后续内容吗?它不是为了添加后续问题。不,您不能在lambda表达式中使用全局语句。lambda有noe语句列表,它是一个表达式。只需使用
 change\u money
函数。您问题中的假设是错误的。lambda不需要返回值。
change\u money
没有返回值。