Mro trong python với ví dụ là gì?

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?

Đế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
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ự kế thừa từ trái sang phải.

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ôi

Bướ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
class A

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 Bapt

Kim 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 A kế thừa từ hai lớp BC, cả hai đều kế thừa từ một lớp cơ sở D. Đối với một phương thức foo() trong lớp D, lớp A sẽ kế thừa hai bản sao của nó - một từ mỗi cha. Vì vậy, bản sao nào sẽ được gọi cho một đối tượng a của lớp A khi một người gọi cho A0?

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 B xuất hiện trước lớp C trong tuyến tính hóa của lớp A, thì B sẽ xuất hiện trước C trong tuyến tính hóa của bất kỳ lớp nào bắt nguồn từ A. mặt khác, việc tạo một lớp con có thể thay đổi thứ tự giải quyết và gây ra các lỗi khó chịu. Trước phiên bản 2. 3, Python đã sử dụng một thuật toán gốc tuy nhiên nó được phát hiện là không đơn điệu. Trong Python 2. 3, thuật toán gốc đã bị bỏ qua để ủng hộ tuyến tính hóa C3 được phát triển về mặt học thuật, chuyển sang Python 3

Lấy MRO cho đối tượng a của lớp A cũng đơn giản như gọi B8, tuy nhiên, nếu bạn quan tâm đến cách tính toán thực sự được thực hiện, hãy tiếp tục đọc

C3 áp dụng phương pháp chia để trị để tính tuyến tính hóa theo cách sau. đặt A là một lớp kế thừa từ các lớp cơ sở C0, C1, … C2. Tuyến tính hóa của A là tổng của A cộng với sự hợp nhất của tuyến tính hóa của cha mẹ và danh sách cha mẹ

L[A(B1 … Bn)] = A + hợp nhất(L[B1] … L[Bn], B1 … Bn)

Để thực hiện hợp nhất

  • Nhìn vào đầu của danh sách đầu tiên. L[B1][0]
  • Nếu đầu này là “đầu tốt”, có nghĩa là nó không xuất hiện ở phần đuôi của bất kỳ danh sách nào khác - hãy thêm nó vào tuyến tính hóa của A và xóa nó khỏi tất cả các danh sách trong hợp nhất
  • Nếu không, hãy nhìn vào phần đầu của danh sách tiếp theo và nếu đó là "phần đầu tốt", hãy thêm nó vào quá trình tuyến tính hóa
  • Lặp lại cho đến khi loại bỏ hết các lớp hoặc không còn đầu tốt. Trong trường hợp sau, việc xây dựng thất bại

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 B

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 C6 xuất hiện trước một lớp cụ thể hơn C. Điều này nhấn mạnh sự chú ý cẩn thận cần được trả khi thiết kế các hệ thống phân cấp đa kế thừa phức tạp.

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. C8. Điều này là do thứ tự giải quyết phương thức không rõ ràng đối với lớp C. thứ tự của D0 và D1 không rõ ràng trong quá trình tuyến tính hóa của C. Thuật toán C3 không thể tuyến tính hóa hệ thống phân cấp và Python ngăn việc tạo ra nó. Đây là một ví dụ khác về tầm quan trọng của thứ tự các lớp cơ sở

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 .