使用装饰器改变方法的return值
Using decorator to change the return value of a method
我有一个 TextBox
和一个 Button
。当用户点击 Enter 时,我希望单击与 TextBox
相关的特定按钮。 TextBox
和 Button
是 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()
我有一个 TextBox
和一个 Button
。当用户点击 Enter 时,我希望单击与 TextBox
相关的特定按钮。 TextBox
和 Button
是 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()