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
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
属性之所以有效,是因为QObject有一个处理它们的元类。看看@quark代码上的这个小变化…:
运行该程序会发出:
^{pr2}$看到区别了吗?在实际上是一个遗留类(旧类型)的类中,第二次生成的类是}也不会再看到属性)。但是在第一种情况下,Qt的情况下,有一个不同的元类,它是type的子类(所以说类“不是new-style”是不正确的!)因此,事情是正确的。在
classobj
(它不是类型的子类),并且属性不能正常工作(赋值x.x
会绕过属性,之后获得{至少在PyQt4.5中,Qt类肯定是新样式的对象,从它们的方法解析顺序来看:
根据我的经验,Python排序的属性在PyQt4对象上工作得很好。我不知道PyQt4是否明确支持它们,或者是否存在一些隐藏的陷阱,但我从未见过它们行为不端。下面是一个使用PyQt 4.4和Python 2.5的示例:
^}允许使用与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版本。在
相关问题 更多 >
编程相关推荐