Eigenschaft funktioniert, weil QObject eine Metaklasse hat, die sich um sie kümmert. Sehen Sie sich diese kleine Variation des Codes von @quark an...:
from PyQt4.QtCore import QObject
def makec(base):
class X( base ):
def __init__(self):
self.__x = 10
def get_x(self):
print 'getting',
return self.__x
def set_x(self, x):
print 'setting', x
self.__x = x
x = property(get_x, set_x)
print 'made class of mcl', type(X), issubclass(type(X), type)
return X
class old: pass
for base in (QObject, old):
X = makec(base)
x = X()
print x.x # Should be 10
x.x = 30
print x.x # Should be 30
der dies ausstrahlt:
made class of mcl <type 'PyQt4.QtCore.pyqtWrapperType'> True
getting 10
setting 30
getting 30
made class of mcl <type 'classobj'> False
getting 10
30
Sehen Sie den Unterschied? In der Klasse, die eigentlich eine Legacy-Klasse (vom alten Typ) ist, nämlich die, die zum zweiten Mal erstellt wurde, lautet die Metaklasse classobj
(die keine Unterklasse des Typs ist) und die Eigenschaften funktionieren nicht richtig (Zuweisung von x.x
umgeht die Eigenschaft, und danach wird x.x
sieht die Immobilie auch nicht mehr). Aber im ersten Fall, dem Qt-Fall, gibt es eine andere Metaklasse, und es IST eine Unterklasse von type (also ist es nicht wirklich korrekt zu sagen, die Klasse "ist nicht new-style"!), und die Dinge funktionieren daher korrekt.