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