2009-08-04 13 views
5

Oldukça basit bir soru. Birçok yerde, eski stil sınıfındaki özelliklerin kullanılmamasının işe yaramadığını gördüm, fakat görünüşe göre Qt sınıfları (PyQt4 ile) yeni bir tarz değil ve kodun birkaçında özellikler var. (ve kodu bildiğim kadarıyla herhangi bir sorun göstermemekte)Eski stil python sınıfındaki özelliklerin kullanılması sorunlara neden oluyor

Bir pyqtProperty işleviyle karşılaştım, ancak bu konuda herhangi bir belge bulamıyorum. Bu durumda iyi bir alternatif olur muydu?

cevap

4

ö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

3

Python sıralama işinin özellikleri, deneyimlerime göre, PyQt4 nesnelerini kullanabiliyor. PyQt4 tarafından açık bir şekilde desteklenip desteklenmediklerini veya bazı gizli tuhaflıklar olup olmadığını bilmiyorum, ama onları hiç yanlış görmedim. Burada PyQt 4.4 ve Python 2.5 kullanılarak bir örnek verilmiştir:

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 Python'un aynı değildir Qt's property system kullanarak sağlamaktır. Qt özellikleri Qt C++ sınıfları içinden (ham Python özelliklerine sahip değildir) içsel olarak anlaşılır ve Qt tarafından Qt Designer form düzenleyicisi ve Qt Creator IDE gibi şeyler için kullanılır. Python'da sahip olduğunuz ve C++ içinde özlediğiniz çalışma zamanı durumunun bir tür iç gözlemine izin verir. Genel olarak Qt, dinamik dillerin bazı özelliklerini C++ 'ya sağlar ve bu, PyQt'nun Birden Fazla Yoldan Aynı şeyi yapmasını sağlayan tek alan değildir (aynı zamanda dizeleri, sözlükleri, G/Ç dosyalarını ve diğerlerini de dikkate alın). Bu seçeneklerin çoğunda, sahip olduğum ana tavsiye, sadece bir tarafını veya diğerini seçip, hoş olmayan bir uyumsuzluk olasılığını önlemek için onunla uğraşmaktır. Python'un Qt sürümü üzerinde Python versiyonunu tercih etme eğilimindeyim çünkü Python benim çalışmamın Qt'den daha çekirdeğidir. Eğer PyQt'den C++ Qt'ye bir şey çizmeyi düşünecekseniz, Python'un birindeki Qt versiyonunu tercih edebilirsiniz.

1

En azından PyQt4.5 içinde, Qt sınıfları kesinlikle yeni stil nesneler ARE:

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'>) 
+0

Garip, belki kodunu kontrol için kullandığınız aracı yanlış anlamaktır ... –

+0

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) –

+0

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 –

İlgili konular