La propiedad funciona porque QObject tiene una metaclase que se ocupa de ellos. Sea testigo de esta pequeña variación en el código de @ quark ...:
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
ejecutar este emite:
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
ver la diferencia? En la clase que es realmente una clase heredada (antigua), la que se creó por segunda vez, la metaclase es classobj
(que NO ES una subclase de tipo) y las propiedades no funcionan bien (la asignación de x.x
omite la propiedad y luego que al obtener x.x
ya no ve la propiedad tampoco). Pero en el primer caso, el caso Qt, hay una metaclase diferente, y ES una subclase de tipo (por lo que no es correcto decir que la clase "no es de estilo nuevo") y, por lo tanto, las cosas SI funcionan correctamente.
extraño, tal vez la herramienta que estamos utilizando para comprobar el código está entendiendo mal ... –
De acuerdo con los documentos de PyQt "En las versiones de PyQt anteriores a la v4.5, existían restricciones sobre el uso de super con las clases de PyQt. Estas restricciones ya no se aplican con v4.5 y posterior". Si está utilizando una versión anterior a la 4.5, ¿tal vez ese sea el problema? Si no, ¡estoy perdido! (fuente: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#super-and-pyqt-classes) –
Corrí la misma prueba en la mía y me dice lo mismo , Voy a seguir adelante y asumir que la herramienta que estamos utilizando es simplemente confusa. Gracias –