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.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it_.jpg.webp)
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.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__2.jpg.webp)
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ừ object
lớ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 object
lớ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 MultiDerived
lớ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 MultiDerived
lớ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.
![](https://cdn.wiki-base.com/1428282/python_multiple_inheritance_what_is_it_and_how_to_use_it__3.jpg.webp)
# 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.