özellik, QObject'in bunlara önem veren bir metaclass sahip olduğu için çalışır. ... @ kuarkın koduna bu küçük bir varyasyonunu Tanık:
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
çalışan bu yayar:
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
farkı görüyor musunuz? Gerçekten eski (eski tip) bir sınıf olan sınıfta, ikinci kez yapılan metaclass
classobj
(ISN'T türünde bir alt sınıf) ve özellikler doğru çalışmıyor (
x.x
özelliği atlayarak ve sonra
x.x
'u almanın daha fazla özelliği yoktur. Ama ilk durumda, Qt durumunda, farklı bir metaclass var, ve bir tür alt sınıf IS (bu yüzden sınıf "yeni stil değil" demek gerçekten doğru değil!), Ve bu nedenle DO işler doğru çalışır. Onların yöntem çözünürlüğü siparişinden görüldüğü gibi
Garip, belki kodunu kontrol için kullandığınız aracı yanlış anlamaktır ... –
PyQt belgelerine göre "PyQt'nin v4.5'ten önceki sürümlerinde PyQt sınıflarıyla süper kullanımına ilişkin kısıtlamalar vardı. Bu kısıtlamalar artık v4.5 ve sonrasında geçerli değil." 4.5'den önceki bir sürümü kullanıyorsanız, sorun bu olabilir mi? Değilse, ben kaybettim! (kaynak: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#super-and-pyqt-classes) –
Aynı sınamayı da çalıştırdım ve bana aynı şeyi anlatıyor Devam edeceğim ve kullandığımız aracın sadece kafası karıştığını farz edeceğim. Teşekkürler –