使用装饰器改变方法的return值

Using decorator to change the return value of a method

我有一个 TextBox 和一个 Button。当用户点击 Enter 时,我希望单击与 TextBox 相关的特定按钮。 TextBoxButton 是 class。我将 Button 实例传递给 TextBox,以便我们知道应该单击一个。 Button 是一个 class,有 2 个方法 click()autoclick()

我想要的是 autoclick() 检查 Enter 键是否被按下并使 click() return 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 Button:
    @autoclick # this is how decorators are used.
    def click(self):
        return False

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

我认为以下部分需要修改

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)()

类似于:

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

    def box(self):
        if enterPressed:
            if self.button is not None:
                self.button.click = self.button.autoclick(self.button.click)  # this line is changed

更新

我猜你应该是指以下内容:

class Button:
    def _click(self):  # Maybe this method have events as parameters?
        return False

    def click(self):
        return self._click()

    def autoclick(self):
        def wrapper(*args):
            self._click(*args)  # This function needs events as it arguments
            self.click = self._click
            return True

        self.click = wrapper


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

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

或者这一个? :

class Button:
    def _click(self):  # Maybe this method have events as parameters?
        return False

    def click(self):
        return self._click()

    def autoclick(self):
        def wrapper(*args):
            result = self._click(*args)  # This function needs events as it arguments
            if enterPressed:
                return True
            return result

        self.click = wrapper


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

    def box(self):
        if self.button is not None:
            self.button.autoclick()