为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

缥缈止盈 2023-04-18 17:08:32
我有一个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 wrapperb = 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")我没有收到任何错误,但它根本不起作用。
查看完整描述

2 回答

?
撒科打诨

TA贡献1934条经验 获得超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


查看完整回答
反对 回复 2023-04-18
?
慕的地10843

TA贡献1785条经验 获得超8个赞

我认为以下部分需要修改


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


查看完整回答
反对 回复 2023-04-18
  • 2 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信