Hướng dẫn how do you use multilevel inheritance in python? - làm thế nào để bạn sử dụng kế thừa đa cấp trong python?
Python Nhiều kế thừaMột lớp có thể được lấy từ nhiều lớp cơ sở trong Python, tương tự như C ++. Điều này được gọi là nhiều kế thừa. Show
Trong nhiều kế thừa, các tính năng của tất cả các lớp cơ sở được kế thừa vào lớp dẫn xuất. Cú pháp cho nhiều kế thừa tương tự như thừa kế đơn. Thí dụ
Ở đây, lớp nhiều người có nguồn gốc từ các lớp Base1 và Base2. Nhiều kế thừa trong PythonLớp nhiều người thừa kế từ cả hai lớp Base1 và Base2. Kế thừa đa cấp PythonChúng ta cũng có thể kế thừa từ một lớp học dẫn xuất. Điều này được gọi là kế thừa đa cấp. Nó có thể có bất kỳ độ sâu nào trong Python. Trong kế thừa đa cấp, các tính năng của lớp cơ sở và lớp dẫn xuất được kế thừa vào lớp dẫn xuất mới. Một ví dụ với trực quan tương ứng được đưa ra dưới đây.
Ở đây, lớp dẫn xuất1 có nguồn gốc từ lớp cơ sở và lớp dẫn xuất2 có nguồn gốc từ lớp dẫn xuất1. Di sản đa cấp trong PythonThứ tự giải quyết phương pháp trong PythonMỗi lớp học trong Python đều có nguồn gốc từ lớp 3. Nó là loại cơ sở nhất trong Python.Vì vậy, về mặt kỹ thuật, tất cả các lớp khác, được tích hợp hoặc do người dùng xác định, là các lớp có nguồn gốc và tất cả các đối tượng là các trường hợp của lớp 3.
Trong kịch bản nhiều kế thừa, bất kỳ thuộc tính được chỉ định nào được tìm kiếm đầu tiên trong lớp hiện tại. Nếu không được tìm thấy, việc tìm kiếm tiếp tục vào các lớp phụ huynh ở thời trang sâu, trái phải mà không tìm kiếm cùng một lớp hai lần. Vì vậy, trong ví dụ trên của lớp 5, thứ tự tìm kiếm là [ 5, 7, 8, 3]. Thứ tự này còn được gọi là tuyến tính hóa của lớp 5 và tập hợp các quy tắc được sử dụng để tìm thứ tự này được gọi là thứ tự phân giải phương thức (MRO).Method Resolution Order (MRO).MRO phải ngăn chặn đặt hàng ưu tiên cục bộ và cũng cung cấp tính đơn điệu. Nó đảm bảo rằng một lớp học luôn xuất hiện trước cha mẹ của nó. Trong trường hợp của nhiều phụ huynh, thứ tự giống như các bộ dữ liệu của các lớp cơ sở. MRO của một lớp có thể được xem là thuộc tính 1 hoặc phương thức 2. Cái trước trả lại một tuple trong khi cái sau trả lại một danh sách.
Dưới đây là một ví dụ kế thừa đa dạng phức tạp hơn một chút và trực quan hóa của nó cùng với MRO. Hình dung nhiều kế thừa trong Python
Đầu ra [ Để biết thuật toán thực tế về cách tính toán MRO, hãy truy cập thảo luận về MRO. Thứ tự giải quyết phương pháp: Trong Python, mỗi lớp dù được tích hợp hoặc do người dùng xác định đều có nguồn gốc từ lớp đối tượng và tất cả các đối tượng là các thể hiện của đối tượng lớp. Do đó, lớp đối tượng là lớp cơ sở cho tất cả các lớp khác. Trong trường hợp của nhiều kế thừa, một thuộc tính nhất định lần đầu tiên được tìm kiếm trong lớp hiện tại nếu nó không tìm thấy thì nó đã tìm kiếm trong các lớp cha. Các lớp cha được tìm kiếm theo kiểu bên trái và mỗi lớp được tìm kiếm một lần. Nếu chúng ta thấy ví dụ trên thì thứ tự tìm kiếm các thuộc tính sẽ được bắt nguồn, base1, base2, object. Thứ tự được theo sau được gọi là tuyến tính hóa của lớp có nguồn gốc và thứ tự này được tìm thấy bằng cách sử dụng một tập hợp các quy tắc gọi là thứ tự phân giải phương thức (MRO). Để xem MRO của một lớp: & nbsp; & nbsp; Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class Sử dụng phương thức mro (), nó trả về danh sách & nbsp; ví dụ. Class4.mro () Sử dụng thuộc tính _MRO_, nó trả về một tuple & nbsp; ví dụ. Class4 .__ MRO __ & nbsp; & nbsp; [,,,,] & nbsp; (,,,,) & nbsp; & nbsp;“m” which is an overridden method in one of Class2 and Class3 or both then the ambiguity arises which of the method “m” Class4 should inherit. Làm thế nào để bạn sử dụng kế thừa đa cấp? Python3 3 4 5 6 7 8 9 0 1 2 3 4 3 6 5 6 7 8 9 0 1 2 5 4 3 8 5 6 7 8 9 0 1 2[7 [8 3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class0 5Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class2 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class4 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class5 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class6 Output: In Class2 Lưu ý: Khi bạn gọi obj.m () (m trên thể hiện của class4), đầu ra nằm trong Class2. Nếu Class4 được khai báo là Class4 (Class3, Class2) thì đầu ra của obj.m () sẽ nằm trong Class3. & NBSP;
When you call obj.m() (m on the instance of Class4) the output is In Class2. If Class4 is declared as Class4(Class3, Class2) then the output of obj.m() will be In Class3. Khi phương thức được ghi đè trong một trong các lớp & nbsp; Python3 3 4 5 6 7 8 9 0 1 2 3 4 3 6 5Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class2 3 8 5 6 7 8 9 0 1 2[7 In Class4 In Class2 In Class3 In Class14 3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class0 5Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class2 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class4 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class5 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class6 Output: In Class3 Lưu ý: Khi bạn gọi obj.m () (m trên thể hiện của class4), đầu ra nằm trong Class2. Nếu Class4 được khai báo là Class4 (Class3, Class2) thì đầu ra của obj.m () sẽ nằm trong Class3. & NBSP; Python3 3 4 5 6 7 8 9 3 6 3 6 5 6 7 8 9 0 1 2 5 4 3 8 5 6 7 8 9 34 1 2[7 38 3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class0 5 6 7 8 9 0 1 2 49 50Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class4 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class5 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class6 55 56 57Output: Lưu ý: Khi bạn gọi obj.m () (m trên thể hiện của class4), đầu ra nằm trong Class2. Nếu Class4 được khai báo là Class4 (Class3, Class2) thì đầu ra của obj.m () sẽ nằm trong Class3. & NBSP;Khi phương thức được ghi đè trong một trong các lớp & nbsp;In Class4. The method “m” of Class4 is executed. To execute the method “m” of the other classes it can be done using the class names. Python3 3 4 5 6 7 8 9 3 6 3 6 5 6 7 8 9 0 1 2 5 4 3 8 5 6 7 8 9 0 1 2[7 38 3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class0 5 6 7 8 9 0 1 2 49 50 0 07 8 4 0 11 8 4 0 15 8 4Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class4 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class5 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class6 Output: In Class4 In Class2 In Class3 In Class1 Lưu ý: Khi bạn gọi obj.m () (m trên thể hiện của class4), đầu ra nằm trong Class2. Nếu Class4 được khai báo là Class4 (Class3, Class2) thì đầu ra của obj.m () sẽ nằm trong Class3. & NBSP; Python3 3 4 5 6 7 8 9 0 1 2 3 50 3 6 5 6 7 8 9 0 1 2 5 4Khi mọi lớp xác định cùng một phương thức 3 8 5 6 7 8 9 0 1 2[7 4 0 15 8 50 3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class0 5 6 7 8 9 0 1 2 49 50 0 07 8 4 0 11 8 4Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class4 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class5 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class6 Output: 1Lưu ý: Khi bạn gọi obj.m () (m trên thể hiện của class4), đầu ra nằm trong Class2. Nếu Class4 được khai báo là Class4 (Class3, Class2) thì đầu ra của obj.m () sẽ nằm trong Class3. & NBSP; Khi phương thức được ghi đè trong một trong các lớp & nbsp; Python3 3 4 5 6 7 8 9 0 1 2 3 4 3 6 5 6 7 8 9Khi mọi lớp xác định cùng một phương thức 0 15 16 3 8 5 6 7 8 9 0 1 2[7 4 0 15 16 3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class0 5 6 7 8 9 0 1 2 49 50 0 15 16Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class3 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class4 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class5 Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived(Base1, Base2): Body of the class6 Output: In Class4 In Class2 In Class3 In Class1 Lưu ý: Khi bạn gọi obj.m () (m trên thể hiện của class4), đầu ra nằm trong Class2. Nếu Class4 được khai báo là Class4 (Class3, Class2) thì đầu ra của obj.m () sẽ nằm trong Class3. & NBSP;method resolution order (MRO). Thứ tự giải quyết phương pháp:Trong Python, mỗi lớp dù được tích hợp hoặc do người dùng xác định đều có nguồn gốc từ lớp đối tượng và tất cả các đối tượng là các thể hiện của đối tượng lớp. Do đó, lớp đối tượng là lớp cơ sở cho tất cả các lớp khác. Trong trường hợp của nhiều kế thừa, một thuộc tính nhất định lần đầu tiên được tìm kiếm trong lớp hiện tại nếu nó không tìm thấy thì nó đã tìm kiếm trong các lớp cha. Các lớp cha được tìm kiếm theo kiểu bên trái và mỗi lớp được tìm kiếm một lần. Nếu chúng ta thấy ví dụ trên thì thứ tự tìm kiếm các thuộc tính sẽ được bắt nguồn, base1, base2, object. Thứ tự được theo sau được gọi là tuyến tính hóa của lớp có nguồn gốc và thứ tự này được tìm thấy bằng cách sử dụng một tập hợp các quy tắc gọi là thứ tự phân giải phương thức (MRO). Để xem MRO của một lớp: & nbsp; & nbsp;
Example: Python3 3 4 5 6 7 8 9 0 1 2 3 4 3 6 5 6 7 8 9 3 6 0 15 16 0 1 2 5 4 5 6 7 8 9 0 1 2[7 4 0 15 16 3 6 5 6 7 8 9 0 1 2 49 50 0 15 16 1 09 1 11Output: 3 >>> MultiDerived.__mro__
(
|