在旧式python类上使用属性是否会导致问题

2024-04-26 06:44:26 发布

您现在位置:Python中文网/ 问答频道 /正文

很简单的问题。我在很多地方都提到,在旧样式的类上使用属性不应该起作用,但是显然Qt类(通过PyQt4)并不是新样式,在我使用的代码中有一些属性(据我所知,代码没有显示任何问题)

我确实遇到了一个pyqtProperty函数,但似乎找不到任何关于它的文档。在这种情况下,这会是一个好的选择吗?在


Tags: 函数代码文档属性地方情况样式qt
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

运行该程序会发出:

^{pr2}$

看到区别了吗?在实际上是一个遗留类(旧类型)的类中,第二次生成的类是classobj(它不是类型的子类),并且属性不能正常工作(赋值x.x会绕过属性,之后获得{}也不会再看到属性)。但是在第一种情况下,Qt的情况下,有一个不同的元类,它是type的子类(所以说类“不是new-style”是不正确的!)因此,事情是正确的。在

至少在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'>)

根据我的经验,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

^ }允许使用与Python不相同的Qt's property system。Qt属性是从Qt的C++类(原始Python属性不在)中自检的,并用Qt用于它们的Qt Designer表单编辑器和Qt Creatoride。他们允许对Python的EM>运行时间状态进行反思,在C++中忽略。一般来说,Qt提供了C++语言的一些动态语言的特性,这不是PyQT提供一种以上方式来做同样事情的唯一区域(也考虑字符串、字典、文件I/O等)。对于这些选择中的大多数,我的主要建议就是选择其中一方并坚持下去,只是为了避免一些令人不快的不兼容的可能性。我倾向于使用Python版本而不是Qt版本,因为Python比Qt更为核心。如果你想考虑从PyQT中移植任何东西到C++ QT,那么你可能更喜欢Python上的Qt版本。在

相关问题 更多 >