Khi thứ tự kế thừa bạn khai báo mâu thuẫn với thuật toán C3 linearization, tức là không tồn tại thứ tự nào thoả cả hai ràng buộc: giữ đúng thứ tự base bạn viết ra, và giữ mọi lớp con luôn đứng trước lớp cha.
class A: ...
class B(A): ...
class C(A, B): ... # TypeErrorC(A, B) yêu cầu A đứng trước B, nhưng B là con của A nên B bắt buộc phải đứng trước A. Hai ràng buộc loại trừ nhau → không có MRO hợp lệ. Sửa bằng cách viết lớp cụ thể trước, lớp tổng quát sau: class C(B, A).
C3 bảo đảm ba tính chất: giữ thứ tự khai báo cục bộ, giữ quan hệ con-trước-cha, và đơn điệu (thứ tự tương đối giữa hai lớp không đổi khi đi xuống các lớp con sâu hơn).
Cách kiểm tra và dùng:
C.__mro__ # inspect the resolved orderLiên quan trực tiếp tới super(): super() đi theo MRO của type thực tế của instance, không phải theo lớp cha tĩnh viết trong code.
- Vì vậy trong đa kế thừa, mọi lớp trên chuỗi phải cùng gọi
super().__init__(...)và nhận**kwargs— nếu một lớp gọi thẳngBase.__init__(self)thì chuỗi cooperative bị đứt và có nhánh không bao giờ được khởi tạo. - Đây cũng là lý do mixin nên đặt trước base class trong danh sách kế thừa.