MRO trong Python là gì?

Trong bài viết này, tôi sẽ thảo luận về Thứ tự giải quyết phương pháp (MRO) trong Python với các ví dụ. Vui lòng đọc bài viết trước của chúng tôi, nơi chúng tôi đã thảo luận về Kế thừa trong Python. Là một phần của bài viết này, chúng ta sẽ thảo luận về các gợi ý sau có liên quan đến Thứ tự giải quyết phương thức trong Python
  1. Thứ tự giải quyết phương pháp (MRO) là gì
  2. Ba nguyên tắc của MRO
Thứ tự giải quyết phương pháp (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
  1. 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
  2. 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
  3. 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 MRO

MRO trong Python là gì?

Nơi đây,

  1. mro(A)=AN, đối tượng
  2. mro(B)=B, A, đối tượng
  3. mro(C)=C, A, đối tượng
  4. 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

MRO trong Python là gì?

Chương trình. MRO contd (demo10. 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")

c=C()
c.m1()
print(C.mro())

đầu ra

MRO trong Python là gì?

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. py
class 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

MRO trong Python là gì?

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

MRO trong Python là gì?

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

MRO trong Python là gì?

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

MRO trong Python là gì?

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 MRO

MRO trong Python là gì?

Nơi đây,

  1. mro(A)=AN, đối tượng
  2. mro(B)=B, đối tượng
  3. mro(C)=C, đối tượng
  4. mro(X)=X, A, B, đối tượng
  5. mro(Y)=Y, B, C, đối tượng
  6. mro(P)=P, X, A, Y, B, C, đối tượng
Chương trình. MRO (bản demo15. py)
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

MRO trong Python là gì?

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

MRO trong Python là gì với ví dụ?

Thứ tự phân giải phương thức (MRO) là thứ tự mà Python tìm kiếm một phương thức trong hệ thống phân cấp của các lớp . Đặc biệt, nó đóng vai trò quan trọng trong bối cảnh đa thừa kế vì một phương thức có thể được tìm thấy trong nhiều siêu lớp. Để hiểu khái niệm về MRO và nhu cầu của nó, hãy xem xét một vài trường hợp.

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 .

Nguyên tắc của MRO là gì?

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ở . 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ở.

Công dụng của MRO là gì?

MRO là viết tắt của bảo trì, sửa chữa và vận hành. Nó đề cập đến tất cả các hoạt động cần thiết để giữ cho các cơ sở và quy trình sản xuất của công ty hoạt động trơn tru .