Python,修饰函数中的参考类实例/方法

问题描述 投票:0回答:2

我很难找到一种在装饰器函数中引用类实例的方法。

import json
import time
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from main_UI import Ui_ApplicationWindow
from slack import RTMClient

class WorkerThread(QThread):
  finished = pyqtSignal(str)   

  def __init__(self):
    QThread.__init__(self)  
    self.rtm_client = RTMClient(token="xoxp...") 

  def run(self):     
    self.rtm_client.start()

  @RTMClient.run_on(event="message")
  def say_hello(**payload):
    data = payload['data']
    if (len(data) != 0):
      if "text" in data:          
        text = data['text']         
        self.finished.emit(str(text))  


class ApplicationWindow(QMainWindow):

  def __init__(self):
    super(ApplicationWindow, self).__init__()
    self.ui = Ui_ApplicationWindow()
    self.ui.setupUi(self)   
    self.ui.pushButton.clicked.connect(self.start_rtm)      

  def start_rtm(self):
    self.thread = WorkerThread()
    self.thread.finished.connect(self.update)
    self.thread.start()

  @pyqtSlot(str)
  def update(self, data):
    self.ui.label.setText(data)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = ApplicationWindow()
    myWindow.show()
    app.exec_()

所以在say_hello中,因为它不能使用self作为参数,所以我无法在函数末尾使用self.finished.emit(text)

如何在self中使用say_hello引用类实例/函数?

python-3.x pyqt python-decorators
2个回答
0
投票

实际上,您不能自已,因为那是一个全局变量,而不是一类。

from slack import RTMClient

class WorkerThread(QThread):
    finished = pyqtSignal(dict)

    def __init__(self):
        QThread.__init__(self)
        self.rtm_client = RTMClient(token="xoxp-....")    

    def run(self):
        self.rtm_client.start()

    @RTMClient.run_on(event="message")
    def say_hello(**payload):
        data = payload['data']
        if (len(data) != 0):
            if "text" in data:          
                text = data['text']                      
                WorkerThread.finished.emit(text)  <--- using self impossible 

我建议您通过在开头添加两个下划线(__my_private_var)将此类变量设为私有”>


0
投票

不,您不能。代替使用@RTMClient.run_on()装饰器,使用@RTMClient.run_on()函数对其进行注册。

© www.soinside.com 2019 - 2024. All rights reserved.