C'è un programma semplice in python3:python3 eccellente non funziona con le classi 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) Quando la classe Foo eredita da QtCore.QObject e Bar otteniamo:
(<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) Quando la classe Foo eredita da FakeQObject e Bar otteniamo:
(<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 domanda è: perché nel caso a), Bar init non si chiama?
Ho trovato una domanda simile qui pyQt4 and inheritance ma non ci sono buone risposte.
Grazie in anticipo!
Sospetto che sia perché 'QtCore.QObject' non utilizza la cooperativa super .__init__'. BTW, in Python 3, non hai bisogno di 'super (Foo, self)'; 'super()' dovrebbe essere sufficiente. – nneonneo
Sì, ma il sito PyQt http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html dice: "Nelle versioni di PyQt precedenti alla v4.5 c'erano restrizioni sull'uso di Super con Classi PyQt. Queste restrizioni non si applicano più con la v4.5 e successive. " Quindi, questo è un bug di PyQt, non è vero? – vitvlkv
Grazie per super() senza parametri, non lo sapevamo .. – vitvlkv