【发布时间】:2021-04-15 13:04:12
【问题描述】:
我正在尝试从另一个类中重复调用装饰函数,这样每次调用函数时都会执行装饰器。
原始问题如下,但与正确指出的 pyqt 没有明确关系。
我正在尝试在 pyqt 线程中使用装饰器。根据我对装饰器的理解,每次调用函数时都应该执行装饰。 (或者至少这是我想要的。)但是,从 pyqt 线程中调用装饰函数会导致装饰器只执行一次。
这是我测试过的例子:
import time, sys
import numpy as np
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Decor:
def deco(self, *args, **kwargs):
print(kwargs['txt'])
print("In decorator")
def inner(func):
return func
return inner
dec = Decor()
class Window(QWidget):
def __init__(self, parent = None):
QWidget.__init__(self, parent)
self.thread = Worker()
label = QLabel(self.tr("random number"))
self.thread.output[str].connect(label.setText)
layout = QGridLayout()
layout.addWidget(label, 0, 0)
self.setLayout(layout)
self.thread.start()
class Worker(QThread):
output = pyqtSignal(str)
def run(self):
# Note: This is never called directly. It is called by Qt once the
# thread environment has been set up.
while True:
time.sleep(1)
number = self.random()
self.output.emit('random number {}'.format(number))
@dec.deco(txt='kw_argument')
def random(self):
return np.random.rand(1)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
我希望在调用self.normal() 时经常得到'kw_argument' 和'in decorator' 的打印,但只得到一次。我做错了什么?
【问题讨论】:
-
没有。装饰器只有在被处理时才会被调用,并立即返回被装饰的函数。你想达到什么目的?
-
欢迎来到 Stack Overflow!我不认为这个问题是 PyQt 特有的。您是否尝试过在独立的 Python 脚本中使用装饰器来查看它是否有同样的问题?找出导致您的问题的原因是呈现良好 MRE 的一部分。
-
啊,谢谢!是的你是对的。对不起,我意识到它确实不是 PyQt 特有的。我确实在没有 PyQt 的情况下尝试过,但犯了一个愚蠢的错误,导致我认为它与 pyqt 相关。