Python QObject,PyQt5中的PyQT信号

Python QObject,PyQt5中的PyQT信号,python,pyqt5,Python,Pyqt5,参见代码: from PyQt5.QtCore import QObject, pyqtSignal class QtSignal(QObject): signal = pyqtSignal() # Case 1: signal = pyqtSignal() print(type(signal)) # Case 2: qtSignal = QtSignal() print(type(qtSignal.signal)) 对于案例1,它输出,但是对于案例2,它输出 两种情况的区别在

参见代码:

from PyQt5.QtCore import QObject, pyqtSignal

class QtSignal(QObject):

    signal = pyqtSignal()

# Case 1:
signal = pyqtSignal()
print(type(signal))

# Case 2:
qtSignal = QtSignal()
print(type(qtSignal.signal))
对于案例1,它输出,但是对于案例2,它输出


两种情况的区别在于是否在QObject的子类中定义qtSignal。但是,如果pyqtSignal是在QObject的子类中定义的,为什么pyqtSignal会变成pyqtBoundSignal呢?

pyqtSignal遵循所谓的描述符协议。这是最著名的在财产装饰,但你发现了很多其他用途

这样做的结果是,通过访问属性,它可以获得对调用它的对象的引用。在你的例子中,QtSignal的例子。结果是绑定信号。这和Klass的方法是一样的


这是必要的,因为当你发出信号时,你确实需要一个发送者。这就是pyqt知道自己是谁的方式

PyQt5文档:。你能给我一些例子来解释将pyqtSignal更改为pyqtBoundSignal的实现吗?我不理解你的问题。pyqtSignal的实现是开源的。你看过描述符协议了吗?这解释了这样一个东西是如何实现的。如果pyqtSignal是在QObject的子类中定义的,为什么pyqtSignal会变成pyqtBoundSignal?QObject是否有特殊的内部实现?您是否已经第三次查看了我所知道的描述符协议?这实际上与QObject本身无关,而是一种纯python机制,有助于使代码更具声明性,但仅此而已。