使用装饰器改变方法的返回值

我有一个TextBox和一个Button。当用户点击时,我希望点击Enter与相关的特定按钮。并且是类。我将实例传递到 中,以便我们知道应该单击一个实例。是一个有 2 个方法和的类。TextBoxTextBoxButtonButtonTextBoxButtonclick()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")

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


缥缈止盈
浏览 85回答 2
2回答

撒科打诨

我想我现在可能知道你想做什么了。试试这个。这就是我们通常使用装饰器的方式。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

慕的地10843

我认为以下部分需要修改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 = wrapperclass 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 = wrapperclass TextBox:    def __init__(self, button=None):        self.button = button    def box(self):        if self.button is not None:            self.button.autoclick()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python