L'utilisation de propriétés sur une classe python de style ancien pose-t-elle des problèmes?

StackOverflow https://stackoverflow.com/questions/1230383

  •  22-07-2019
  •  | 
  •  

Question

Question assez simple. Je l'ai vu mentionné à de nombreux endroits qu'utiliser des propriétés sur une classe de style ancien ne fonctionnerait pas, mais apparemment, les classes Qt (via PyQt4) ne sont pas de nouveau style et qu'il existe des propriétés sur certaines d'entre elles dans le code I travaille avec (et autant que je sache, le code ne montre aucune sorte de problème)

J'ai rencontré une fonction pyqtProperty, mais je n'arrive pas à trouver de documentation à ce sujet. Serait-ce une bonne alternative dans ce cas?

Était-ce utile?

La solution

La propriété

fonctionne car QObject a une métaclasse qui en prend soin. Soyez témoin de cette petite variation du code de @ quark ...:

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

exécuter cela émet:

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

voir la différence? Dans la classe qui est vraiment une classe héritée (de type ancien), celle créée la deuxième fois, la métaclasse est classobj (qui N’EST PAS une sous-classe de type) et les propriétés ne fonctionnent pas correctement (attribution xx contourne la propriété et après cela, obtenir xx ne la voit plus non plus). Mais dans le premier cas, le cas Qt, il existe une métaclasse différente, et il s’agit d’une sous-classe de type (il n’est donc pas vraiment correct de dire que la classe "n’est pas un nouveau style"!), Et les choses fonctionnent donc correctement. .

Autres conseils

D'après mon expérience, les propriétés du tri Python fonctionnent parfaitement sur les objets PyQt4. Je ne sais pas s'ils sont explicitement pris en charge par PyQt4 ou non, ou s'il y a des pièges cachés, mais je ne les ai jamais vus mal se comporter. Voici un exemple utilisant PyQt 4.4 et 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 doit autoriser l'utilisation du système de propriétés de Qt qui n'est pas le même que celui de Python. Les propriétés Qt sont introspectables depuis les classes C ++ de Qt (les propriétés Python brutes ne le sont pas), et sont utilisées par Qt pour des éléments tels que leur Editeur de formulaire Qt Designer et Qt Creator IDE. Ils permettent une grande partie du type d'introspection de l'état d'exécution que vous avez en Python et que vous ratez en C ++. En général, Qt fournit certaines des fonctionnalités des langages dynamiques en C ++, et ce n’est pas le seul domaine dans lequel PyQt fournit plus d’un moyen de faire la même chose (considérez également les chaînes, les dictionnaires, les E / S de fichiers, etc.). Avec la plupart de ces choix, le principal conseil que je vous ai donné est de choisir l'un ou l'autre côté et de vous y tenir, afin d'éviter tout risque d'incompatibilité désagréable. J'ai tendance à préférer la version Python à la version Qt, car Python est plus essentiel à mon travail que Qt. Si vous envisagiez de reporter n'importe quel objet de PyQt vers C ++ Qt, vous préféreriez peut-être utiliser la version Qt d'une fonctionnalité plutôt que celle de Python.

Au moins dans PyQt4.5, les classes Qt SONT certainement de nouveaux objets de style, comme indiqué dans l'ordre de résolution des méthodes:

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'>)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top