Kế thừa nhiều thứ trong Python: Nó là gì và Cách sử dụng nó?

Trong hướng dẫn này, bạn sẽ tìm hiểu về đa kế thừa trong Python và cách sử dụng nó trong chương trình của bạn. Bạn cũng sẽ tìm hiểu về kế thừa đa cấp và thứ tự giải quyết phương pháp.

Kế thừa nhiều Python

Một lớp có thể được bắt nguồn từ nhiều hơn một lớp cơ sở trong Python, tương tự như C ++. Đây được gọi là đa kế thừa.

Trong đa 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 của đa kế thừa tương tự như thừa kế đơn.

Thí dụ

 class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass

Ở đây, lớp MultiDerived có nguồn gốc từ các lớp Base1 và Base2.

Nhiều thừa kế trong Python

Lớp MultiDerived kế thừa từ cả lớp Base1 và Base2.

Kế thừa đa cấp trong Python

Chúng ta cũng có thể kế thừa từ một lớp dẫn xuất. Đây được gọi là kế thừa đa cấp. Nó có thể ở 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.

Dưới đây là một ví dụ với hình ảnh tương ứng.

 class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass

Ở đây, lớp Derived1 có nguồn gốc từ lớp Cơ sở và lớp Derived2 có nguồn gốc từ lớp Derived1.

Kế thừa đa cấp trong Python

Thứ tự phân giải phương thức trong Python

Mọi lớp trong Python đều có nguồn gốc từ objectlớp. Đây là kiểu 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ạo sẵn hoặc do người dùng định nghĩa, đều là các lớp dẫn xuất và tất cả các đối tượng đều là các thể hiện của objectlớp.

 # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))

Trong kịch bản đa kế thừa, bất kỳ thuộc tính nào được chỉ định sẽ được tìm kiếm đầu tiên trong lớp hiện tại. Nếu không tìm thấy, việc tìm kiếm sẽ tiếp tục vào các lớp cha theo chiều sâu đầu tiên, trái phải mà không cần tìm kiếm cùng một lớp hai lần.

Vì vậy, trong ví dụ trên của MultiDerivedlớp thứ tự tìm kiếm là ( MultiDerived, Base1, Base2, object). Thứ tự này còn được gọi là tuyến tính hóa của MultiDerivedlớp 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 pháp (MRO) .

MRO phải ngăn chặn thứ tự ư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 phụ huynh của nó. Trong trường hợp có nhiều cha mẹ, thứ tự giống như bộ giá trị của các lớp cơ sở.

MRO của một lớp có thể được xem như __mro__thuộc tính hoặc mro()phương thức. Cái trước trả về một tuple trong khi cái sau trả về một danh sách.

 >>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() (, , , )

Đây là một ví dụ về đa kế thừa phức tạp hơn một chút và hình dung của nó cùng với MRO.

Hình dung nhiều thừa kế trong Python
 # Demonstration of MRO class X: pass class Y: pass class Z: pass class A(X, Y): pass class B(Y, Z): pass class M(B, A, Z): pass # Output: # (, , # , , # , , # ) print(M.mro())

Đầu ra

 (,,,,,)

Để biết thuật toán thực tế về cách tính MRO, hãy truy cập Thảo luận trên MRO.

thú vị bài viết...