2011-03-07 4 views
1

속성을 이해하기 위해 다음과 같은 작은 스크립트를 작성했습니다. 내가 이해할 수없는 한 가지는, 내 클래스 AmetaObject()에는 이제 conf_name이라는 속성이 포함되어 있다는 것입니다. 어떻게 정보를 얻었습니까? 내 클래스에서는 속성을 설정하는 호출 대상 변수의 이름으로 한 번만 사용됩니다. 어떻게 실현 될 수 있습니까? 그것은 일반 Python, 즉 C API없이 구현할 수 있습니까? 이것은 개체 클래스의 속성으로되어 있지 않은 경우PyQt4의 pyqtProperty 이해

 
#!/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() 

답변

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) 

이 클래스는 내가 thread = My_Thread(blahblahblah)를 만들 경우, 나는이 유형의 모든 다른 스레드의 목록을 얻을 수를 제외하고, 정확한 인터페이스를 일치 QThread의 서브 클래스, 및 쿼리에 의한 서브 클래스를 생성 thread.all_instances 또는 심지어 thread.all_instances[-1].all_instances입니다. 그러나 개체 삭제를 처리하지 않으면 클래스의 각 항목에 대한 참조가 항상 존재하므로 가비지 수집되지 않습니다.

또한 my_locally_scoped_variable__init__의 범위 내에 만 존재하며 속성을 만들지 않습니다.