2009-08-04 3 views
5

Ziemlich einfache Frage. Ich habe an vielen Stellen gesehen, dass die Verwendung von Eigenschaften für eine Klasse im alten Stil nicht funktionieren sollte, aber offensichtlich sind Qt-Klassen (über PyQt4) nicht neu und es gibt Eigenschaften für einige von ihnen im Code I arbeite mit (und soweit ich weiß, der Code zeigt keine Art von Problemen)Führt die Verwendung von Eigenschaften für eine Python-Klasse im alten Stil zu Problemen

Ich habe über eine pyqtProperty-Funktion, aber ich kann nicht scheinen, um Dokumentation darüber zu finden. Wäre es in diesem Fall eine gute Alternative?

Antwort

4

Eigenschaft funktioniert, weil QObject eine Metaklasse hat, die sich um sie kümmert. Zeuge dieses kleine Variation @ Quark Code ...:

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 

läuft diese aussendet:

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 

den Unterschied? In der Klasse, die wirklich eine Legacy (Old-Type) -Klasse ist, die Metaclass ist das zweite Mal, ist classobj (was keine Unterklasse des Typs ist) und Eigenschaften funktionieren nicht richtig (Zuweisung x.x umgeht die Eigenschaft und nach dass bekommen x.x nicht mehr die Eigenschaft auch nicht). Aber im ersten Fall, der Qt-Fall, gibt es eine andere Metaklasse, und es ist eine Unterklasse vom Typ (so ist es nicht richtig zu sagen, die Klasse "ist nicht neu-Stil"!), Und die Dinge funktionieren daher richtig.

3

Eigenschaften der Python-Sortierung funktionieren meiner Erfahrung nach gut für PyQt4-Objekte. Ich weiß nicht, ob sie explizit von PyQt4 unterstützt werden oder nicht, oder ob es versteckte Fallstricke gibt, aber ich habe nie gesehen, dass sie sich schlecht benommen haben. Hier ist ein Beispiel unter Verwendung von PyQt 4.4 und 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 

pyqtProperty zu ermöglichen ist Qt's property system verwendet, die nicht die gleiche wie Python ist. Qt-Eigenschaften sind innerhalb der Qt-C++ - Klassen (die die Python-Roheigenschaften nicht aufweisen) introspectable und werden von Qt für solche Dinge wie ihren Qt Designer-Formulareditor und Qt Creator IDE verwendet. Sie erlauben viel von der Art der Introspektion von Laufzeit Zustand, den Sie in Python und Miss in C++ haben. Im Allgemeinen stellt Qt C++ einige der Funktionen dynamischer Sprachen zur Verfügung, und dies ist nicht der einzige Bereich, in dem PyQt mehr als eine Möglichkeit bietet, dasselbe zu tun (man beachte auch Strings, Wörterbücher, Datei-I/O usw.). Bei den meisten dieser Entscheidungen ist der wichtigste Ratschlag, den ich habe, nur die eine oder die andere Seite auszuwählen und dabei zu bleiben, nur um die Möglichkeit einer unangenehmen Inkompatibilität zu vermeiden. Ich bevorzuge die Python-Version gegenüber der Qt-Version, weil Python für meine Arbeit wichtiger ist als Qt. Wenn Sie in Betracht ziehen würden, etwas von PyQt zurück in C++ Qt zu portieren, könnten Sie die Qt-Version eines Features gegenüber dem von Python bevorzugen.

1

Mindestens in PyQt4.5, Qt-Klassen sind sicherlich neuer Stil Objekte, wie aus ihrer Methode Auflösung, um zu sehen:

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

Seltsam, vielleicht das Werkzeug, das wir den Code zu überprüfen, verwenden wird versteht es falsch ... –

+0

Gemäß der PyQt-Dokumentation "In Versionen von PyQt vor Version 4.5 gab es Einschränkungen bei der Verwendung von Super mit PyQt-Klassen. Diese Einschränkungen gelten ab Version 4.5 nicht mehr." Wenn Sie eine Version vor 4.5 verwenden, ist das vielleicht das Problem? Wenn nicht, bin ich ratlos! (Quelle: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#super-and-pyqt-classes) –

+0

Ich lief den gleichen Test auf meiner und es sagt mir das Gleiche Ich gehe weiter und nehme an, dass das Tool, das wir verwenden, nur verwirrt ist. Vielen Dank –

Verwandte Themen