- Thứ tự giải quyết phương pháp [MRO] là gì
- Ba nguyên tắc của MRO
Trong nhiều tình huống kế thừa, bất kỳ thuộc tính hoặc phương thức cụ thể nào ban đầu sẽ được tìm kiếm trong lớp hiện tại. Nếu không tìm thấy trong lớp hiện tại, thì tìm kiếm tiếp theo tiếp tục vào các lớp cha theo chiều sâu từ trái sang phải. Tìm kiếm theo thứ tự này được gọi là Thứ tự giải quyết phương pháp [MRO]
Ba nguyên tắc của MRO- Nguyên tắc đầu tiên là tìm kiếm lớp con trước khi tìm kiếm các lớp cơ sở của nó. Nếu lớp B được kế thừa từ A, nó sẽ tìm kiếm B trước rồi đến A
- Nguyên tắc thứ hai là nếu lớp nào được kế thừa từ nhiều lớp thì nó tìm kiếm theo thứ tự từ trái qua phải trong các lớp cơ sở. Ví dụ: nếu lớp C được kế thừa từ A và B, về mặt cú pháp là lớp C[A, B], thì đầu tiên nó sẽ tìm kiếm trong A và sau đó trong B
- Nguyên tắc thứ ba là nó sẽ không truy cập bất kỳ lớp nào nhiều hơn một lần. Điều đó có nghĩa là một lớp trong hệ thống phân cấp thừa kế chỉ được duyệt qua chính xác một lần
Hiểu MRO cung cấp cho bạn ý tưởng rõ ràng về lớp nào đang được thực thi và theo trình tự nào. Chúng tôi có một phương thức được xác định trước để xem trình tự thực hiện của các lớp. Nó là. tên lớp. mro[]
Bản demo 1 cho MRONơi đây,
- mro[A]=AN, đối tượng
- mro[B]=B, A, đối tượng
- mro[C]=C, A, đối tượng
- mro[D]=D, B, C, A, đối tượng
Ghi chú. Đối tượng là một siêu lớp mặc định trong python
Chương trình. MRO [bản demo9. py]class A: def m1[self]: print["m1 from A"] class B[A]: def m1[self]: print["m1 from B"] class C[A]: def m1[self]: print["m1 from C"] class D[B, C]: def m1[self]: print["m1 from D"] print[A.mro[]] print[B.mro[]] print[C.mro[]] print[D.mro[]]
đầu ra
class A: def m1[self]: print["m1 from A"] class B[A]: def m1[self]: print["m1 from B"] class C[A]: def m1[self]: print["m1 from C"] class D[B, C]: def m1[self]: print["m1 from D"] c=C[] c.m1[] print[C.mro[]]
đầu ra
Trong chương trình trên, với đối tượng c, chúng ta đang gọi phương thức m1. Vì vậy m1[] đã có sẵn trong lớp C nên đầu ra là m1 từ C
Chương trình. demo11. pyclass A: def m1[self]: print["m1 from A"] class B[A]: def m1[self]: print["m1 from B"] class C[A]: def m2[self]: print["m2 from C"] class D[B, C]: def m1[self]: print["m1 from D"] c=C[] c.m1[] print[C.mro[]]
đầu ra
Trong chương trình trên, với đối tượng 'c', chúng ta đang gọi phương thức m1. Nhưng phương thức m1[] không có trong lớp C. Đầu tiên tìm kiếm sẽ ở lớp C, sau đó nó sẽ ở lớp A vì A là siêu lớp đối với C. Trong lớp A có sẵn phương thức m1[] nên đầu ra là ‘m1 from A’
Chương trình. MRO tiếp theo. [demo12,py]class A: def m1[self]: print["m1 from A"] class B[A]: def m1[self]: print["m1 from B"] class C[A]: def m1[self]: print["m1 from C"] class D[B, C]: def m1[self]: print["m1 from D"] d=D[] d.m1[] print[D.mro[]]
đầu ra
Trong chương trình trên, với đối tượng 'd', chúng ta đang gọi phương thức m1. Vì, phương thức m1[] đã có sẵn trong lớp D, nên đầu ra là 'm1 from D'
Chương trình. MRO contd [demo13. py]class A: def m1[self]: print["m1 from A"] class B[A]: def m1[self]: print["m1 from B"] class C[A]: def m1[self]: print["m1 from C"] class D[B, C]: def m3[self]: print["m3 from D"] d=D[] d.m1[] print[D.mro[]]
đầu ra
Trong chương trình trên, với đối tượng 'd', chúng ta đang gọi phương thức m1[]. Nhưng, phương thức m1[] không khả dụng trong lớp D. Vì vậy, tiếp theo nó sẽ tìm kiếm trong lớp B vì nó là siêu lớp so với lớp D và cũng là lớp đầu tiên được tìm kiếm theo MRO. Trong lớp B, phương thức m1[] có sẵn, vì vậy đầu ra là 'm1 từ B'
Chương trình. MRO contd [demo14. py]class A: def m1[self]: print["m1 from A"] class B[A]: def m2[self]: print["m1 from B"] class C[A]: def m1[self]: print["m1 from C"] class D[B, C]: def m3[self]: print["m3 from D"] d=D[] d.m1[] print[D.mro[]]
đầu ra
Trong chương trình trên, với đối tượng 'd', chúng ta đang gọi phương thức m1[]. Vì phương thức m1[] không có sẵn trong lớp D nên nó sẽ tìm kiếm trong lớp B dựa trên MRO [lớp B là lớp cha của lớp D]. phương thức m1[] cũng không khả dụng trong lớp B. Vì vậy, tiếp theo nó sẽ tìm kiếm trong lớp C vì C cũng là siêu hạng của lớp D. Trong lớp C có sẵn phương thức m1[] nên đầu ra là ‘m1 from C’
Demo2 cho MRONơi đây,
- mro[A]=AN, đối tượng
- mro[B]=B, đối tượng
- mro[C]=C, đối tượng
- mro[X]=X, A, B, đối tượng
- mro[Y]=Y, B, C, đối tượng
- mro[P]=P, X, A, Y, B, C, đối tượng
class A: def m1[self]: print["m1 from A"] class B: def m1[self]: print["m1 from B"] class C: def m1[self]: print["m1 from C"] class X[A, B]: def m1[self]: print["m1 from C"] class Y[B, C]: def m1[self]: print["m1 from A"] class P[X, Y, C]: def m1[self]: print["m1 from P"] print[A.mro[]]#AO print[X.mro[]]#XABO print[Y.mro[]]#YBCO print[P.mro[]]#PXAYBCO
đầu ra
Trong bài viết tiếp theo, tôi sẽ thảo luận về hàm Super[] trong Python. Ở đây, trong bài viết này, tôi cố gắng giải thích Thứ tự giải quyết phương pháp [MRO] bằng Python. Tôi hy vọng bạn thích bài viết Thứ tự giải quyết phương pháp [MRO] trong Python này. Tôi muốn có phản hồi của bạn. Vui lòng gửi phản hồi, câu hỏi hoặc nhận xét của bạn về bài viết này