在 python 中,将函数用作类的属性的正确语法是啥? [关闭]
Posted
技术标签:
【中文标题】在 python 中,将函数用作类的属性的正确语法是啥? [关闭]【英文标题】:In python, what is the proper syntax for using a function as an attribute of a class? [closed]在 python 中,将函数用作类的属性的正确语法是什么? [关闭] 【发布时间】:2021-06-02 22:14:27 【问题描述】:我是编程新手,我正在尝试通过在 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, button_surf, change_money(2))
但这不起作用。
问题 1 将函数作为类属性传递的正确语法是什么?特别是,如果函数有输入,你会怎么做?
问题 2 理想情况下,我希望不必为简单操作 money = money + 1
定义新函数。有没有办法将这样的函数作为类的属性传递而不必给它一个名字? (例如,button = Button(button_rect, button_surf, [money -> money + 1])
之类的东西。
编辑1:感谢您使用lambda函数的建议;我不知道这些。有没有办法让 lambda 函数采用全局变量?天真的lambda global money : money = money + 2
或lambda : money = money + 2
似乎不起作用。我的直觉(基于 Rabbid76 的 reference)是这些 lambda 函数非常适合使用 return 语句“模仿”函数,但是如果我想模仿没有 return 语句的函数,比如 change_money()?
【问题讨论】:
lambda: change_money(2)
?参见例如docs.python.org/3/tutorial/controlflow.html#lambda-expressions.
感谢您的回答。我可以向您推荐编辑 1 中的后续内容吗?
【参考方案1】:
使用lambda:
button2 = Button(button_rect, button_surf, change_money(2))
button2 = Button(button_rect, button_surf, lambda: change_money(2))
有没有办法让 lambda 函数接受一个全局变量?
不,您不能在 lambda 表达式中使用 global
statement。 lambda 没有语句列表,它是一个表达式。
【讨论】:
感谢您的回答。我可以向您推荐 Edit1 中的后续内容吗? 无意添加后续问题。不,您不能在 lambda 表达式中使用 global 语句。 lambda 没有语句列表,它是一个表达式。只需使用change_money
函数。你问题中的假设是错误的。 lambda 不需要返回值。 change_money
没有返回值。以上是关于在 python 中,将函数用作类的属性的正确语法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Python中类的声明,使用,属性,实例属性,计算属性及继承,重写
如何将 Python 2 unicode() 函数转换为正确的 Python 3.x 语法