Trong ví dụ trên, lớp đối tượng là SuperClass. Các lớp sẽ kế thừa theo thứ tự nào? Show Đến đây, MRO. MRO được sử dụng chủ yếu để có được thứ tự các phương thức sẽ được kế thừa khi có nhiều kế thừa. Python 3 sử dụng thuật toán tuyến tính hóa C3 cho MRO Tuyến tính hóa lớp C Trong đó L[C] đại diện cho danh sách theo thứ tự C sẽ kích hoạt phương thức của các siêu lớp Trong ví dụ trên L[C] = C + hợp nhất( L[A], L[B], AB) L[A] = A + merge(L[O], O) # tuyến tính hóa của lớp cơ sở đối tượng (O) về cơ bản là danh sách đơn, i. chính nó L[A] = AO L[B] = BO # Quy trình tương tự như L[A] vì vậy L[C] = C + hợp nhất (AO, BO, AB) Bây giờ làm thế nào để tính toán hợp nhất? Bước 1. - Đứng đầu danh sách đầu tiên Đầu và đuôiBước 2. - Nếu phần đầu này không nằm trong phần đuôi của bất kỳ danh sách nào khác thì hãy thêm nó vào tuyến tính hóa của C và loại bỏ tất cả các thể hiện của nó khỏi danh sách trong hợp nhất. Nếu không, hãy nhìn vào đầu của danh sách tiếp theo và lấy nó nếu đó là một cái đầu tốt Bước 3. - Sau đó lặp lại thao tác cho đến khi loại bỏ hết các lớp hoặc không tìm được đầu tốt Bây giờ L[C] = C + hợp nhất (AO, BO, AB) L[C] = CA+ hợp nhất( O, BO, B) # đầu = A L[C] = CAB+ hợp nhất( O, O) # đầu = B L[C] = CABO # đầu =O Vì vậy, mã sẽ in class C Bạn có thể nhận thấy rằng super chỉ gọi phương thức của lớp cha theo thứ tự mà chúng được kế thừa từ trái sang phải trong trường hợp này (A, B). Vì vậy, trước tiên super sẽ tìm kiếm phương thức trong A nếu không tìm thấy thì trong B Có vẻ như C3 không hữu ích cho ví dụ này mà làm cho mọi thứ phức tạp hơn. Nhưng nó sẽ hữu ích cho một kế thừa lai phức tạp. Hãy xem ví dụ này Cách Python hỗ trợ đa thừa kế bằng cách sử dụng tuyến tính hóa C3 và tại sao thứ tự của các lớp cơ sở lại quan trọngẢnh của Andre Taissin trên BaptKim cương tử thần chết người - vấn đề đa thừa kế được biết đến nhiều nhất, phát sinh khi lớp Thứ tự phân giải phương pháp (MRO) là một thuật toán để xây dựng tuyến tính hóa - danh sách tất cả các tổ tiên của một lớp, bao gồm cả chính lớp đó, được sắp xếp từ gần nhất đến xa nhất. Đây là thứ tự tra cứu các phương thức và thuộc tính. Mặc dù tuyến tính hóa là tầm thường đối với một kế thừa, nhưng nó trở nên phức tạp đối với nhiều kế thừa Một yêu cầu quan trọng từ một MRO là tính đơn điệu. nếu lớp Lấy MRO cho đối tượng C3 áp dụng phương pháp chia để trị để tính tuyến tính hóa theo cách sau. đặt L[A(B1 … Bn)] = A + hợp nhất(L[B1] … L[Bn], B1 … Bn) Để thực hiện hợp nhất
Nghe có vẻ tối nghĩa? Tính toán tuyến tính hóa cho hệ thống phân cấp này bằng thuật toán C3 sẽ như thế này L[A] = A + hợp nhất(L[B], L[C], BC) Để tính L[A] trước hết chúng ta phải tính các thành phần của nó. L[B] và L[C] Việc tính toán L[C] cũng tương tự Bây giờ L[A] có thể được tính Trong trường hợp này, cũng như trong hầu hết các trường hợp, tuyến tính hóa “có lý”. các lớp thấp hơn, chuyên biệt hơn xuất hiện sớm hơn trong hệ thống phân cấp so với các lớp cao hơn và phổ biến hơn. Tuy nhiên, đây không phải là luôn luôn như vậy. Để minh họa điều này, chúng tôi chỉ giới thiệu một thay đổi nhỏ trong ví dụ trước và hoán đổi thứ tự của các lớp cơ sở cho lớp hãy tính toán L[A] cho hệ thống phân cấp đã sửa đổi, bắt đầu bằng việc tính toán lại L[B] Không chỉ thứ tự của toàn bộ hệ thống phân cấp đã thay đổi, giờ đây một lớp tổng quát hơn Vậy, Kim cương chết chóc thì sao? May mắn thay, C3 đã hỗ trợ giải quyết vấn đề này một cách khéo léo Tuy nhiên, không phải mọi hệ thống phân cấp khả thi đều có thể được tuyến tính hóa trong khi vẫn giữ tính đơn điệu Điều này sẽ dẫn đến. MRO trong Python là gì?Thứ tự phân giải phương pháp (MRO) là tập hợp các quy tắc xây dựng quá trình tuyến tính hóa . Trong tài liệu Python, thành ngữ "MRO của C" cũng được sử dụng như một từ đồng nghĩa với việc tuyến tính hóa lớp C.
Làm cách nào để tính toán mro trong Python?Để lấy MRO của một lớp, bạn có thể sử dụng thuộc tính __mro__ hoặc phương thức mro() . Thuộc tính __mro__ trả về một bộ, nhưng phương thức mro() trả về một danh sách python.
Kế thừa đa cấp trong Python với ví dụ là gì?Trong python, Kế thừa đa cấp là một loại kế thừa được sử dụng để kế thừa cả các tính năng của lớp cơ sở và lớp dẫn xuất sang lớp dẫn xuất mới khi .
MRO được tính như thế nào?MRO được sử dụng chủ yếu để lấy thứ tự các phương thức sẽ được kế thừa khi có nhiều kế thừa. Python 3 sử dụng thuật toán tuyến tính hóa C3 cho MRO. L[C] = C + hợp nhất tuyến tính hóa cha của C và danh sách cha của C theo thứ tự chúng được kế thừa từ trái sang phải . |