理解PyQt4中的pyqtProperty
我写了一个小脚本来理解属性。现在我有一个疑问,我的类 A
的 metaObject()
里怎么会有一个叫 conf_name
的属性?我在类里只用过一次这个名字,作为设置属性时目标变量的名称。这个是怎么实现的呢?能不能用普通的 Python 来实现,也就是不使用 C API?
#!/usr/bin/python
from PyQt4.QtCore import QObject, pyqtProperty
from PyQt4.QtGui import QApplication
class A( QObject ):
def __init__( self, parent = None ):
QObject.__init__( self )
self._name = ""
def getName( self ):
return self._name
def setName( self, value ):
self._name = value
conf_name = pyqtProperty( "QString", getName, setName )
a = QApplication([])
ai = A()
for i in range( ai.metaObject().propertyCount() ):
print ai.metaObject().property( i ).name()
1 个回答
0
如果这个东西不应该是你对象类的一个属性,那它应该放在这个类的 __init__
函数里。你现在看到的是一个类属性,这个属性会被所有这个类型的对象继承,也就是说,所有从这个类派生出来的对象都会有这个属性。
这其实可以非常有用。比如说:
for PyQt4.QtCore import QThread
class My_Thread(QThread):
all_instances = []
def __del__(self, *args, **kwargs):
all_instances.remove(self)
QThread.__del__(self, *args, **kwargs)
def __init__(self, *args, **kwargs):
QThread.__init__(self, *args, **kwargs)
my_locally_scoped_variable = None
self.all_instances.append(self)
这个类创建了一个 QThread 的子类,它的接口完全一样。不过,如果我创建 thread = My_Thread(blahblahblah)
,我就可以通过查询 thread.all_instances
来获取所有这个类型的线程,甚至是它的任何子类的线程,像 thread.all_instances[-1].all_instances
这样。你需要注意的是,要处理对象的删除,否则每个类的实例都会一直存在引用,这样就不会被垃圾回收了。
另外要注意的是,my_locally_scoped_variable
只在 __init__
的范围内存在,并不会创建一个属性。