свойство работает, потому что у объекта QObject есть метакласс, который заботится о них. Свидетель этот небольшой вариации на коде @ кварка ...:
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
работает Срабатывает:
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
увидеть разницу? В классе, который на самом деле является классом старого (старого типа), который был сделан во второй раз, метакласс classobj
(который НЕ является подклассом типа), и свойства не работают правильно (присвоение x.x
обходит это свойство, а после что получение x.x
больше не отображает объект). Но в первом случае, в случае Qt, существует другой метакласс, и он является подклассом типа (поэтому не совсем правильно сказать, что класс «не является новым»!), И поэтому они работают корректно.
Странно, может быть, инструмент мы используем, чтобы проверить код является понимание того, что неправильно ... –
Согласно документам PyQt «В версиях PyQt раньше, чем v4.5, существовали ограничения на использование суперпользователей с классами PyQt. Эти ограничения больше не применяются к v4.5 и более поздним версиям». Если вы используете версию до 4.5, возможно, это проблема? Если нет, я в недоумении! (источник: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#super-and-pyqt-classes) –
Я провел тот же тест на своем, и он говорит мне то же самое , Я собираюсь пойти дальше и предположить, что инструмент, который мы используем, просто запутан. благодаря –