Câu trả lời là "kết hợp cả hai". Bạn có thể tự kiểm tra bằng cách sử dụng inspect.getmro()
, hoạt động trên cả các lớp kiểu cũ và kiểu mới. Nó trả về MRO, tức là thứ tự phân giải phương thức.
Bất kỳ lớp học kiểu cũ nào có MRO là cơ sở đầu tiên, từ đầu đến cuối. (Đây là một ý tưởng tồi cho các trường hợp phức tạp nhất, nhưng vẫn giữ khả năng tương thích là lạc hậu.) Chúng ta có thể thể hiện nó như thế này, mà làm việc vì MRO của mọi tầng lớp cha mẹ đã được tính toán:
mro(new_class) = [new_class] + mro(first_base) + mro(second_base) + ...
Đối mới- lớp học phong cách, thuật toán sử dụng ý tưởng cơ bản giống nhau, nhưng là phức tạp hơn --- nó cũng bắt đầu với [new_class]
nhưng được theo sau bởi một số kết hợp thông minh hơn của danh sách mro(first_base)
, mro(second_base)
vv
Cho dù mỗi người trong các lớp học cơ sở là kiểu cũ hoặc kiểu mới, họ đã có MRO riêng của họ được tính trước đó, và các MRO này (như danh sách) là thứ duy nhất được sử dụng để tính toán MRO của lớp mới.
Nguồn
2013-06-11 13:47:27
woah ... dường như mọi người thích câu hỏi. Cảm ơn bạn –