Có một chương trình đơn giản trong python3:python3 siêu không làm việc với các lớp 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) Khi lớp Foo thừa hưởng từ QtCore.QObject và Bar chúng tôi nhận được:
(<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) Khi lớp Foo thừa hưởng từ FakeQObject và Bar chúng tôi nhận được:
(<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
câu hỏi đặt ra là: tại sao trong a) trường hợp, Bar init không được gọi?
Tôi tìm thấy câu hỏi tương tự ở đây pyQt4 and inheritance nhưng không có câu trả lời hay.
Cảm ơn trước!
Tôi nghi ngờ đó là vì 'QtCore.QObject' không sử dụng hợp tác super.'__init__'. BTW, trong Python 3, bạn không cần 'siêu (Foo, tự)'; 'super()' là đủ. – nneonneo
Có, nhưng trang web PyQt http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/gotchas.html cho biết: "Trong các phiên bản PyQt sớm hơn v4.5 có các hạn chế về việc sử dụng siêu dữ liệu Các lớp PyQt. Các hạn chế này không còn áp dụng với v4.5 trở lên nữa. " Vì vậy, đây là một lỗi của PyQt, phải không? – vitvlkv
Cảm ơn siêu() không có thông số, không biết về nó .. – vitvlkv