Hãy nói về một cái gì đó nghe có vẻ khá phức tạp.
Nó được gọi là MRO hoặc thứ tự phân giải phương pháp.
Nó có nghĩa là gì?
Tôi có một ví dụ ở đây cho bạn.
Giả sử chúng ta có một lớp A lớp B kế thừa từ lớp A hoàn toàn không làm gì cả.
Và sau đó chúng ta cũng có lớp C kế thừa lại từ A và cuối cùng là lớp D, sau đó kế
thừa từ B và C.
Vì vậy, chúng ta có hai lớp hoàn toàn không làm gì cả, và sau đó là lớp A và lớp C có
cùng thuộc tính đối tượng lớp.
Và tôi đã thực sự rút ra được mối quan hệ này như thế nào.
Bạn thấy rằng D có đa thừa kế từ B và C và B và C thừa kế từ A.
Và Amro hay thứ tự phân giải phương thức là một quy tắc mà Python tuân theo để xác định thời điểm bạn chạy một phương thức nào
sẽ chạy khi bạn có cấu trúc kế thừa phức tạp như vậy.
Amro là một quy tắc nói rằng, Này, làm điều này, làm điều này, và sau đó làm điều đó.
Và đó là phương pháp mà bạn nên chạy.
Hãy để tôi chỉ cho bạn những gì tôi muốn nói.
Giả sử tôi muốn in dx dot num.
Bạn nghĩ điều gì sẽ xảy ra ở đây?
Hãy để tôi chuyển điều này ra khỏi cách hoặc bình luận điều này ra.
Nếu tôi chạy nó, bạn có đoán được điều gì sẽ xảy ra không?
Nếu tôi bấm Chạy.
Tôi nhận một cái?
Đó có phải là những gì bạn mong đợi?
Hãy xem qua điều này.
DD kế thừa từ B và C.
Và sau đó những thứ đó kế thừa từ tôi.
Vì vậy, chúng tôi nhận được một vì MRO, thứ tự giải quyết phương pháp là nó không đi D, b, a.
Thay vào đó nó đi d.
B.
C.
MỘT.
Hừ!
Hãy suy nghĩ về điều này nhiều hơn một chút.
Và Miro chỉ đơn giản là nói những gì đầu tiên trong dòng nếu những thứ chung giữa các lớp, phương thức hoặc biến hoặc
thuộc tính?
Tôi nên chọn cái gì?
Và thực sự có một cách tốt để chúng tôi kiểm tra điều này nếu tôi làm vậy, Miro, và sau đó chạy nó như thế này.
Chạy hồ giả.
Nhìn kìa.
Đây là thứ tự hoặc Maro của lớp này.
Nó nói, Này, tôi sẽ kiểm tra D trước.
Nếu bạn gọi, hãy nói D dot name hoặc d dot num.
Tôi sẽ kiểm tra chính chấm D trước.
Vì vậy mình sẽ kiểm tra lớp này, sau đó tôi sẽ kiểm tra chính chấm B, vì vậy tôi sẽ kiểm tra B
và sau đó tôi sẽ kiểm tra C.
Và sau đó tôi sẽ kiểm tra a.
Và cuối cùng, tôi sẽ kiểm tra lại đối tượng lớp cơ sở.
Chúng tôi đã thấy điều đó trước đây.
Đó là lớp cơ sở mà tất cả các đối tượng trong Python kế thừa.
Vì vậy, đó là thứ tự mà nó kiểm tra.
Bây giờ, nếu chúng ta vượt qua tất cả những điều này.
Và tôi nhấp vào Chạy.
Tôi sẽ có được một không khí.
D không có thuộc tính num vì nó đã đi qua tất cả con đường này, thậm chí đã kiểm tra đối tượng cơ sở và không bao
giờ tìm thấy num.
Nếu tôi đã làm một cái gì đó giống như SW tr.
Nếu tôi bấm Chạy.
Điều này hoạt động vì nó đi xuyên suốt chuỗi kế thừa và sau đó đến đối tượng cơ sở.
Và đối tượng cơ sở thực sự có điều này nên nó không xảy ra lỗi.
Và vâng, bạn có thể sử dụng chuỗi dunder.
Hiện nay.
Tôi đã tìm thấy một ví dụ tuyệt vời ở đây để cho bạn thấy lý do tại sao việc thừa kế có thể gây nhầm lẫn và tại
sao những thứ như Amro mà bạn có thể muốn tránh hoặc ít nhất là có ý thức.
Vì vậy, hãy sao chép mã này.
Và chúng ta hãy loại bỏ tất cả những điều này.
Và chúng ta sẽ chơi một trò chơi nhỏ.
Bây giờ cú pháp này.
Hình như thế này.
Vì vậy, đây là mô hình kế thừa của những gì chúng ta vừa tạo.
Trông khá khó hiểu phải không?
Vì vậy, nếu chúng tôi làm chúng ở đây.
Và chúng tôi kiểm tra MRO hoặc thứ tự phân giải phương thức của M.
Bạn nghĩ thứ tự sẽ như thế nào?
Tạm dừng video tại đây và thử đoán xem thứ tự sẽ như thế nào.
Sẳn sàng.
Hãy làm tôi chấm amro.
Và nhân tiện, một cách khác để làm điều này là sử dụng giấy bìa cứng và chúng ta hãy in nó.
Được rồi, hãy kiểm tra cái này.
Vì vậy, điều đầu tiên chúng ta có là em.
Được chứ?
Chúng tôi kiểm tra anh ta, và sau đó chúng tôi kiểm tra B, chúng tôi kiểm tra B, được rồi.
Và sau đó chúng tôi kiểm tra A.
Vì vậy, chúng tôi kiểm tra A ở đây, và sau đó chúng tôi kiểm tra x x ở đây, sau đó là y.
Sau đó là Z, sau đó là đối tượng lớp.
Đó có phải là những gì bạn đoán?
Hãy nhìn vào mã.
Tại sao lại đặt hàng này?
Chà, thứ tự là do cách chúng ta truyền các tham số mà bạn thấy được chuyển trước A
và Z.
Vì vậy, điều đó có nghĩa là thứ tự của Maro sẽ là sau đó a.
Nhưng hãy giữ lấy Bina.
Đó là gì?
Sau B và A, chúng ta có lớp x.
Tại sao X đến trước Z?
Vì vậy, thay vì đi đến Z, hãy làm cho điều này lớn hơn một chút.
Thay vì đi đến cái mà chúng ta sẽ nghĩ là Z, nó chuyển đến X, rồi Y, rồi Z, sau đó là
đối tượng.
Điều này là do thuật toán mà họ sử dụng để thực hiện Miro, được gọi là độ sâu cho tìm kiếm.
Bây giờ điều này nằm ngoài phạm vi của khóa học, nhưng như bạn có thể thấy, nó khá khó hiểu.
Và trên thực tế, Python thực sự đã thay đổi các quy tắc MISO so với những gì chúng ta có trước đây trong các phiên
bản Python trẻ hơn.
Vì vậy, đây là một trong những thứ khác đã được cập nhật.
Nhưng lý do tôi cho bạn thấy điều này là vì bạn sẽ không bao giờ thử nghiệm những thứ này.
Nếu bạn đang viết mã mà phần thừa kế trông giống như thế này, tôi cho rằng bạn đang viết mã
xấu bởi vì điều này quá phức tạp.
Chúng tôi thậm chí chưa viết bất kỳ mã nào thực sự bên trong các lớp này, và nó đã gây nhầm lẫn.
Vì vậy, Amro ở đó như một cách để xác định thứ tự bạn sẽ kế thừa nó.
Và bạn luôn có thể sử dụng chức năng MRO hoặc DUNDAR để kiểm tra điều này.
Nhưng lý do tôi đưa nó ở đây không chỉ là cố gắng làm bạn bối rối.
Lý do là nó tồn tại.
Tuy nhiên, bạn không nên cấu trúc mã của mình theo cách này.
Điều này không có nghĩa là điều này không xảy ra trong tự nhiên.
Có, nó có.
Nhưng ít nhất bạn có một cách để kiểm tra và có thể gỡ lỗi mã của bạn khi bạn gặp sự cố như thế này.
Tôi sẽ để lại một nguồn cho bạn về Maro.
Nếu bạn thực sự tò mò và bạn thực sự muốn hiểu thuật toán này hoạt động như thế nào và thứ tự này thực sự được
xác định như thế nào.
Nhưng điểm mấu chốt là đây là cách Python hoạt động để xác định, này, khi bạn gọi một
phương thức hoặc một thuộc tính.
Đây là cách tôi sẽ tra cứu thứ bậc của các khoản thừa kế.
Được rồi.
Nếu não của bạn bị đau, đừng lo lắng.
Của tôi cũng vậy.
Hãy nghỉ ngơi và hẹn gặp lại các bạn trong video tiếp theo.
Tạm biệt.