Il existe un programme simple python3:python3 super ne fonctionne pas avec les classes PyQt
from PyQt4 import QtCore
import PyQt4
class Bar(object):
def __init__(self):
print("Bar start")
super(Bar, self).__init__()
print("Bar end")
class FakeQObject(object):
def __init__(self):
print("FakeQObject start")
super(FakeQObject, self).__init__()
print("FakeQObject end")
class Foo(QtCore.QObject, Bar):
#class Foo(FakeQObject, Bar):
def __init__(self):
print("Foo start")
super(Foo, self).__init__()
print("Foo end")
print(Foo.__mro__)
print(PyQt4.QtCore.PYQT_VERSION_STR)
f = Foo()
a) Lorsque la classe Foo hérite de QtCore.QObject et nous obtenons Bar:
(<class '__main__.Foo'>, <class 'PyQt4.QtCore.QObject'>, <class 'sip.wrapper'>, <class 'sip.simplewrapper'>, <class '__main__.Bar'>, <class 'object'>)
4.9.4
Foo start
Foo end
b) Lorsque la classe Foo hérite de FakeQObject et nous obtenons Bar:
(<class '__main__.Foo'>, <class '__main__.FakeQObject'>, <class '__main__.Bar'>, <class 'object'>)
4.9.4
Foo start
FakeQObject start
Bar start
Bar end
FakeQObject end
Foo end
la question est: pourquoi dans le a) cas, Bar init est pas appelé?
J'ai trouvé une question similaire ici pyQt4 and inheritance mais il n'y a pas de bonnes réponses.
Merci d'avance!
Je suppose que c'est parce que 'QtCore.QObject' n'utilise pas le super.'init__' coopératif. BTW, en Python 3, vous n'avez pas besoin de 'super (Foo, self)'; 'super()' devrait être suffisant. – nneonneo
Oui, mais le site PyQt http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html dit: "Dans les versions de PyQt antérieures à la version 4.5, il y avait des restrictions sur l'utilisation de super avec Classes PyQt: ces restrictions ne s'appliquent plus aux versions 4.5 et ultérieures. " Donc, c'est un bug de PyQt, n'est-ce pas? – vitvlkv
Merci pour super() sans params, ne le savais pas .. – vitvlkv