Có vẻ như tôi tình cờ gặp một địa ngục metaclass ngay cả khi tôi không muốn làm gì với nó.Ba thừa kế gây ra xung đột metaclass ... Đôi khi
Tôi đang viết một ứng dụng bằng Qt4 bằng PySide. Tôi muốn tách riêng phần sự kiện theo định nghĩa giao diện người dùng, được tạo ra từ các tệp thiết kế Qt. Do đó tôi tạo ra một "bộ điều khiển" các lớp học, nhưng để giảm bớt cuộc sống của tôi tôi nhiều kế thừa chúng anyways. Ví dụ:
class BaseController(QObject):
def setupEvents(self, parent):
self.window = parent
class MainController(BaseController):
pass
class MainWindow(QMainWindow, Ui_MainWindow, MainController):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.setupEvents(self)
Điều này hoạt động như mong đợi. Nó cũng có thừa kế từ (QDialog
, Ui_Dialog
, BaseController
). Nhưng khi tôi phân lớp BaseController
và cố gắng kế thừa từ lớp con nói (ở vị trí của BaseController
), tôi nhận được một lỗi:
TypeError: Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Làm rõ: Cả QMainWindow
và QDialog
kế thừa từ QObject
. BaseController
cũng phải kế thừa từ nó vì tính chất đặc thù của hệ thống sự kiện Qt. Các lớp Ui_ chỉ kế thừa từ lớp đối tượng Python đơn giản. Tôi đã tìm kiếm các giải pháp, nhưng tất cả chúng đều liên quan đến các trường hợp cố ý sử dụng metaclasses. Vì vậy, tôi phải làm điều gì đó khủng khiếp sai.
EDIT: Mô tả của tôi có thể rõ ràng hơn bằng cách thêm biểu đồ.
dụ làm việc:
QObject
| \___________________
| object |
QMainWindow | BaseController
| /---Ui_MainWindow |
| | MainController
MainWindow-----------------/
Một ví dụ làm việc: ví dụ
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | |
OtherWindow----------------/
Không làm việc:
QObject
| \___________________
| object |
QDialog | BaseController
| /---Ui_OtherWindow |
| | OtherController
OtherWindow----------------/
Tôi không giỏi về metaclasses Python, nhưng tôi nghĩ * vấn đề có thể là khi sắp xếp các lớp cha trong định nghĩa lớp 'MainWindow' của bạn. Chỉ cần đoán thôi. – Tony
Điều làm tôi bối rối nhất là MainWindow hoạt động, trong khi đặt QDialog, Ui_Dialog và controller trong cùng một trình tự: lớp kế thừa từ QObject, lớp kế thừa từ đối tượng, lớp kế thừa từ QObject - vì một số lý do không thành công. – Red
Tôi không biết về python, nhưng trong C++/Qt, nhiều thừa kế từ QObject bị nghiêm cấm. Tôi tự hỏi nếu bạn đang gặp phải vấn đề tương tự, và nó chỉ xảy ra để làm việc trong một số trường hợp của bạn. –