Python 使用decorator更改方法的返回值

Python 使用decorator更改方法的返回值,python,decorator,Python,Decorator,我有一个文本框和一个按钮。当用户点击Enter时,我希望单击与文本框相关的特定按钮文本框和按钮是类。我正在将按钮实例传递到文本框,以便我们知道应该单击一个实例Button是一个包含两种方法的类click()和autoclick() 我想要的是让autoclick()检查是否按下了Enter键,并使click()返回True。我试着使用装饰器,并编写了这个玩具程序来演示我的尝试 class Button: def click(self): return False

我有一个
文本框
和一个
按钮
。当用户点击Enter时,我希望单击与
文本框相关的特定按钮<代码>文本框
按钮
是类。我正在将
按钮
实例传递到
文本框
,以便我们知道应该单击一个实例
Button
是一个包含两种方法的类
click()
autoclick()

我想要的是让
autoclick()
检查是否按下了Enter键,并使
click()
返回
True
。我试着使用装饰器,并编写了这个玩具程序来演示我的尝试

class Button:
    def click(self):
        return False

    def autoclick(self, func, *args):
        def wrapper():
            func(*args)# This function needes events as it argumnet
            return True
        return wrapper

b = Button()
class TextBox:
    def __init__(self, button=None):
        self.button = button

    def box(self):
        if enterPressed:
            if self.button is not None:
                self.button.autoclick(self.button.click, events)()


tb = TextBox(button=b)
while True:
    tb.box()
    if b.click():
        print("this needs to be printed when user hits enter")

我没有收到任何错误,但它根本不起作用。

我想我可能知道你现在想做什么

试试这个。这就是我们通常使用装饰器的方式

class按钮:
@autoclick#这就是装饰器的使用方式。
def单击(自我):
返回错误
def自动单击(自身,功能):
def包装(*args):
func(*args)#此函数在argumnet时需要事件
返回真值
如果按Enter键:
返回包装器
其他:
返回函数

我认为以下部分需要修改

class文本框:
def uuu init uuu(self,button=None):
self.button=按钮
def箱(自身):
如果按Enter键:
如果self.button不是None:
self.button.autoclick(self.button.click,事件)()
例如:

class文本框:
def uuu init uuu(self,button=None):
self.button=按钮
def箱(自身):
如果按Enter键:
如果self.button不是None:
self.button.click=self.button.autoclick(self.button.click)#此行已更改

更新

我想也许你的意思是这样的:

class按钮:
def_click(self):#此方法是否将事件作为参数?
返回错误
def单击(自我):
返回自我。_单击()
def自动单击(自):
def包装(*args):
self._click(*args)#此函数需要事件作为参数
self.click=self.\u单击
返回真值
self.click=包装器
类文本框:
def uuu init uuu(self,button=None):
self.button=按钮
def箱(自身):
如果按Enter键:
如果self.button不是None:
self.button.autoclick()
或者是这个

class按钮:
def_click(self):#此方法是否将事件作为参数?
返回错误
def单击(自我):
返回自我。_单击()
def自动单击(自):
def包装(*args):
result=self._单击(*args)#此函数需要事件作为其参数
如果按Enter键:
返回真值
返回结果
self.click=包装器
类文本框:
def uuu init uuu(self,button=None):
self.button=按钮
def箱(自身):
如果self.button不是None:
self.button.autoclick()

tb.button
始终是无的,因此
self.button.autoclick(self.button.click,events)
将永远不会执行。这个问题已经问过了,所以请随意查看一下@Jack Song抱歉,b是要传递给TextBox的,我更新了这个问题。另一个问题是,实际上从未调用过装饰程序<代码>self.button.autoclick(self.button.click,events)只返回函数处理程序,但不运行函数。啊,是的,我又错了,我更新了问题,对不起,这不起作用。我认为这是因为只有当b.click本身返回True而不是autoclick yes时,我们才会打印某些内容。现在它总是假的。它说autoclick缺少一个必需的位置参数“func”,这在某种意义上是有效的。它设置按钮。单击为True。但现在我想让它回到按钮对象,这样它就可以继续充当按钮而不是按钮boolean@hippozhipos它设置
按钮。单击
,函数将返回
True
,而不仅仅是布尔值
True
。所以你的意思是你想返回
按钮。单击
到被装饰程序包装之前的状态,使它再次成为一个返回
False
的函数?是的,这就是我的意思。@HippoShips我更新了我的答案。我希望我的猜测是正确的:)