Делает свойства использования на проблемах причины класса Python старого стиля

Должно быть возможно записать хранимую процедуру, которая посмотрела бы на метаданные для рассматриваемой таблицы, и создала бы необходимый SQL для обновления одной строки от другого, не имея необходимость к hardcode его. (Получите набор всех столбцов, цикла по нему, и т.д.), Но это походит на очень большую работу.

Вы могли также сделать то же самое в коде приложения (PHP, Perl, C#, или безотносительно), если Вы не можете выполнить его с sprocs.

5
задан Cole Anagnost 4 August 2009 в 23:14
поделиться

3 ответа

свойство работает, потому что QObject имеет метакласс, который заботится о них. Посмотрите на эту небольшую вариацию кода @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

при запуске выдает:

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 (который НЕ ЯВЛЯЕТСЯ подклассом типа), а свойства работают неправильно (присвоение xx обходит свойство, и после этого получение xx также больше не видит свойство). Но в первом случае, в случае Qt, есть другой метакласс, и он ЯВЛЯЕТСЯ подклассом типа (так что было бы неправильно говорить, что класс «не в новом стиле»!), И поэтому все работает правильно.

4
ответ дан 14 December 2019 в 04:44
поделиться

По крайней мере, в 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'>)
1
ответ дан 14 December 2019 в 04:44
поделиться

Свойства сортировки 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 , которая отличается от системы Python. Свойства Qt можно анализировать изнутри классов C ++ Qt (которые не являются исходными свойствами Python) и используются Qt для таких вещей, как редактор форм Qt Designer и Qt Creator IDE. Они позволяют во многом самоанализ состояния выполнения , которое есть у вас в Python и отсутствует в C ++. В целом Qt предоставляет некоторые функции динамических языков для C ++, и это не единственная область, где PyQt предоставляет более одного способа сделать то же самое (учитывайте также строки, словари, файловый ввод-вывод и так далее). С большинством из этих вариантов главный совет, который у меня есть, - просто выбрать одну или другую сторону и придерживаться ее, просто чтобы избежать возможности некоторой неприятной несовместимости. Я предпочитаю версию Python версии Qt, потому что Python более важен для моей работы, чем Qt. Если вы собирались рассмотреть возможность переноса чего-либо из PyQt обратно на C ++ Qt, то вы могли бы предпочесть версию функции Qt версии Python.

просто чтобы избежать неприятной несовместимости. Я предпочитаю версию Python версии Qt, потому что Python более важен для моей работы, чем Qt. Если вы собирались рассмотреть возможность переноса чего-либо из PyQt обратно на C ++ Qt, то вы могли бы предпочесть версию функции Qt версии Python.

просто чтобы избежать неприятной несовместимости. Я предпочитаю версию Python версии Qt, потому что Python более важен для моей работы, чем Qt. Если вы собирались рассмотреть возможность переноса чего-либо из PyQt обратно на C ++ Qt, то вы могли бы предпочесть версию функции Qt версии Python.

3
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: