2009-08-04 4 views
5

Довольно простой вопрос. Я видел, что во многих местах он упоминал, что использование свойств в классе старого стиля не должно работать, но, по-видимому, классы Qt (через PyQt4) не новы, а на некоторых из них есть свойства в коде I Я работаю с (и насколько я знаю, код не показывает каких-либо проблем)Имеет ли использование свойств класс python старого стиля, вызывает проблемы

Я столкнулся с функцией pyqtProperty, но я не могу найти документацию об этом. Будет ли это хорошей альтернативой в этом случае?

ответ

4

свойство работает, потому что у объекта 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, существует другой метакласс, и он является подклассом типа (поэтому не совсем правильно сказать, что класс «не является новым»!), И поэтому они работают корректно.

3

Свойства работы сортировки Python, по моему опыту, очень хорошо работают на объектах PyQt4. Я не знаю, явно ли они поддерживаются PyQt4 или нет, или есть какие-то скрытые ошибки, но я никогда не видел, чтобы они плохо себя чувствовали. Ниже приведен пример с использованием PyQt 4.4 и Python 2.5:

from PyQt4.QtCore import QObject 

class X(QObject): 

    def __init__(self): 
     self.__x = 10 

    def get_x(self): 
     return self.__x 

    def set_x(self, x): 
     self.__x = x 

    x = property(get_x, set_x) 

x = X() 
print x.x # Should be 10 
x.x = 30 
print x.x # Should be 30 

pyqtProperty, чтобы разрешить использование Qt's property system, которое не является таким же, как в Python. Свойства Qt являются интроспективными из Qt-классов C++ (какие исходные свойства Python не являются) и используются Qt для таких форм, как редактор формы Qt Designer и Qt Creator IDE. Они допускают много своего рода интроспекцию времени выполнения, что у вас есть на Python и пропустите на C++. В общем, Qt предоставляет некоторые функции динамических языков для C++, и это не единственная область, где PyQt предоставляет больше, чем один способ сделать то же самое (рассмотрите также строки, словари, файлы ввода/вывода и т. Д.). С большинством этих вариантов основной совет, который у меня есть, - это просто выбрать ту или другую сторону и придерживаться ее, чтобы избежать возможности какой-то неприятной несовместимости. Я предпочитаю вариант Python над версией Qt, потому что Python более явственен для моей работы, чем Qt. Если бы вы решили перенести что-либо из PyQt обратно в C++ Qt, вы можете предпочесть Qt-версию функции над Python.

1

По крайней мере, в PyQt4.5 классы Qt, безусловно, новые объекты стиля, как видно из их разрешения порядка метода:

from PyQt4 import QtGui 
print QtGui.QWidget.__mro__ 
(<class 'PyQt4.QtGui.QWidget'>, <class 'PyQt4.QtCore.QObject'>, <type 'sip.wrapper'>, <class 'PyQt4.QtGui.QPaintDevice'>, <type 'sip.simplewrapper'>, <type 'object'>) 
+0

Странно, может быть, инструмент мы используем, чтобы проверить код является понимание того, что неправильно ... –

+0

Согласно документам PyQt «В версиях PyQt раньше, чем v4.5, существовали ограничения на использование суперпользователей с классами PyQt. Эти ограничения больше не применяются к v4.5 и более поздним версиям». Если вы используете версию до 4.5, возможно, это проблема? Если нет, я в недоумении! (источник: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#super-and-pyqt-classes) –

+0

Я провел тот же тест на своем, и он говорит мне то же самое , Я собираюсь пойти дальше и предположить, что инструмент, который мы используем, просто запутан. благодаря –