5 Stimmen

Verursacht die Verwendung von Eigenschaften in einer Python-Klasse alten Stils Probleme?

Eine ganz einfache Frage. Ich habe gesehen, dass es an vielen Stellen erwähnt, dass die Verwendung von Eigenschaften auf einem alten Stil Klasse sollte nicht funktionieren, aber anscheinend Qt-Klassen (durch PyQt4) sind nicht neu-Stil und es gibt Eigenschaften auf ein paar von ihnen in den Code, mit dem ich arbeite (und so weit ich weiß, der Code zeigt keine Arten von Problemen)

Ich bin auf eine pyqtProperty-Funktion gestoßen, aber ich kann keine Dokumentation dazu finden. Wäre es eine gute Alternative in diesem Fall sein?

4voto

Alex Martelli Punkte 805329

Eigenschaft funktioniert, weil QObject eine Metaklasse hat, die sich um sie kümmert. Sehen Sie sich diese kleine Variation des Codes von @quark an...:

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

der dies ausstrahlt:

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

Sehen Sie den Unterschied? In der Klasse, die eigentlich eine Legacy-Klasse (vom alten Typ) ist, nämlich die, die zum zweiten Mal erstellt wurde, lautet die Metaklasse classobj (die keine Unterklasse des Typs ist) und die Eigenschaften funktionieren nicht richtig (Zuweisung von x.x umgeht die Eigenschaft, und danach wird x.x sieht die Immobilie auch nicht mehr). Aber im ersten Fall, dem Qt-Fall, gibt es eine andere Metaklasse, und es IST eine Unterklasse von type (also ist es nicht wirklich korrekt zu sagen, die Klasse "ist nicht new-style"!), und die Dinge funktionieren daher korrekt.

1voto

Nicolas Lefebvre Punkte 4137

Zumindest in PyQt4.5 SIND Qt-Klassen sicherlich New-Style-Objekte, wie man an der Reihenfolge ihrer Methodenauflösung sieht:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X