在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 没有语句列表,它是一个单独的表达式。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...