如何解决在python中,使用函数作为类的属性的正确语法是什么?
我是编程新手,我正在尝试通过在 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,change_money(2))
但这不起作用。
问题 1 将函数作为类的属性传递的正确语法是什么?特别是,如果函数有输入,你会怎么做?
问题 2 理想情况下,我不想为简单操作 money = money + 1
定义新函数。有没有办法将这样的函数作为类的属性传递而不必给它一个名字? (例如,button = Button(button_rect,[money -> money + 1])
之类的东西。
Edit 1: 感谢您建议使用 lambda 函数;我不知道这些。有没有办法让 lambda 函数采用全局变量?天真的 lambda global money : money = money + 2
或 lambda : money = money + 2
似乎不起作用。我的直觉(基于 Rabbid76 的 reference)是这些 lambda 函数非常适合“模仿”带有 return 语句的函数,但是如果我想模仿一个没有 return 语句的函数,比如 change_money() 呢?
解决方法
使用 lambda:
button2 = Button(button_rect,button_surf,change_money(2))
button2 = Button(button_rect,lambda: change_money(2))
有没有办法让 lambda 函数接受一个全局变量?
不,您不能在 lambda 表达式中使用 global
statement。 lambda 没有语句列表,它是一个单独的表达式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。