微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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 + 2lambda : 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 举报,一经查实,本站将立刻删除。