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

Col*_*ost 5 python properties class pyqt

非常简单的问题.我已经看到它在很多地方都提到在旧式类上使用属性不应该工作,但显然Qt类(通过PyQt4)不是新式的,并且在代码中有一些属性我我正在使用(据我所知,代码没有显示任何类型的问题)

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

Ale*_*lli 4

属性之所以有效,是因为 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
Run Code Online (Sandbox Code Playgroud)

运行这个会发出:

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
Run Code Online (Sandbox Code Playgroud)

看到不同?在真正是遗留(旧类型)类的类中,第二次创建的类是元类classobj(它不是类型的子类)并且属性不能正常工作(分配x.x绕过属性,然后得到x.x也不再看到该属性)。但在第一种情况下,即 Qt 情况,有一个不同的元类,它是类型的子类(因此说该类“不是新样式”并不正确!),因此事情确实可以正常工作。