Tóm lược. trong hướng dẫn này, bạn sẽ tìm hiểu về tính đa thừa kế của Python và cách hoạt động của việc phân giải thứ tự phương thức trong Python
Giới thiệu về Python Đa kế thừa
Khi một lớp kế thừa từ một lớp duy nhất, bạn có một kế thừa duy nhất. Python cho phép một lớp kế thừa từ nhiều lớp. Nếu một lớp kế thừa từ hai lớp trở lên, bạn sẽ có nhiều lớp kế thừa
Để mở rộng nhiều lớp, bạn chỉ định các lớp cha bên trong dấu ngoặc đơn
7 sau tên lớp của lớp con như thế nàyCode language: Python [python]
class Car: def go[self]: print['Going']
Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
Cú pháp đa thừa kế tương tự như danh sách tham số trong định nghĩa lớp. Thay vì bao gồm một lớp cha bên trong dấu ngoặc đơn, bạn bao gồm hai hoặc nhiều lớp, được phân tách bằng dấu phẩy
Hãy lấy một ví dụ để hiểu cách hoạt động của đa thừa kế
Đầu tiên, định nghĩa một lớp
8 có phương thứcCode language: Python [python]
class Car: def go[self]: print['Going']
9Code language: Python [python]
class Car: def go[self]: print['Going']
Code language: Python [python]
class Car: def go[self]: print['Going']
Thứ hai, định nghĩa một lớp
0 có phương thứcCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
1Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
Thứ ba, định nghĩa
2 kế thừa từ cả hai lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
8 vàCode language: Python [python]
class Car: def go[self]: print['Going']
0Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
1Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
Vì
2 kế thừa từ các lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
8 vàCode language: Python [python]
class Car: def go[self]: print['Going']
0 nên nó sử dụng lại các phương thức từ các lớp đó. Nó có nghĩa là bạn có thể gọi các phương thứcCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
9 vàCode language: Python [python]
class Car: def go[self]: print['Going']
1 trên một thể hiện của lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
2 như thế nàyCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
8Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
đầu ra
9Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
Thứ tự giải quyết phương pháp [MRO]
Khi các lớp cha có các phương thức trùng tên và lớp con gọi phương thức đó, Python sẽ sử dụng thứ tự phân giải phương thức [MRO] để tìm kiếm phương thức phù hợp để gọi. Xem xét ví dụ sau
Đầu tiên, thêm phương thức
11 vào các lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
8,Code language: Python [python]
class Car: def go[self]: print['Going']
0 vàCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
2. Trong phương thứcCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
11 của lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
2, hãy gọi phương thứcCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
11 của lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
18Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
8Code language: Python [python]
class Car: def go[self]: print['Going']
Thứ hai, tạo một thể hiện của lớp
2 và gọi phương thứcCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
11Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
1Code language: Python [python]
class Car: def go[self]: print['Going']
đầu ra
2Code language: Python [python]
class Car: def go[self]: print['Going']
Như bạn có thể thấy rõ từ đầu ra,
81 gọi phương thứcCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
11 của lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
0Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
Sau đây cho thấy
84 của lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
2Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
8Code language: Python [python]
class Car: def go[self]: print['Going']
đầu ra
0Code language: Python [python]
class Car: def go[self]: print['Going']
Từ trái sang phải, bạn sẽ thấy
2,Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
0,Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
8 vàCode language: Python [python]
class Car: def go[self]: print['Going']
89Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
Lưu ý rằng các đối tượng
8 vàCode language: Python [python]
class Car: def go[self]: print['Going']
0 kế thừa hoàn toàn từ lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
89. Khi bạn gọi phương thứcCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
11 từ đối tượng củaCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
2, Python sử dụng đường dẫn tìm kiếm lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
84Code language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
Vì lớp
0 nằm cạnh lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
2, nênCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
81 gọi phương thứcCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
11 của lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
2Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
Nếu đảo lộn thứ tự của lớp
0 và lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
8 trong danh sách thì lớpCode language: Python [python]
class Car: def go[self]: print['Going']
84 sẽ thay đổi tương ứng. Ví dụCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
1Code language: Python [python]
class Car: def go[self]: print['Going']
đầu ra
2Code language: Python [python]
class Car: def go[self]: print['Going']
Trong ví dụ này, thay vào đó,
81 gọi phương thứcCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
11 của lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
8, dựa trên thứ tự của chúng trong giải pháp thứ tự phương thứcCode language: Python [python]
class Car: def go[self]: print['Going']
Đa thừa kế và siêu
Đầu tiên, thêm phương thức
87 vào lớpCode language: Python [python]
class Car: def go[self]: print['Going']
8Code language: Python [python]
class Car: def go[self]: print['Going']
3Code language: Python [python]
class Car: def go[self]: print['Going']
Thứ hai, thêm phương thức
87 vào lớpCode language: Python [python]
class Car: def go[self]: print['Going']
0Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
4Code language: Python [python]
class Car: def go[self]: print['Going']
87 của các lớpCode language: Python [python]
class Car: def go[self]: print['Going']
8 vàCode language: Python [python]
class Car: def go[self]: print['Going']
0 chấp nhận một số tham số khác nhau. Nếu lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
2 kế thừa từ lớpCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
8 vàCode language: Python [python]
class Car: def go[self]: print['Going']
0, thì phương thứcCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
87 của lớp đó cần gọi đúng phương thứcCode language: Python [python]
class Car: def go[self]: print['Going']
87 được chỉ định trong giải pháp đặt hàng phương thứcCode language: Python [python]
class Car: def go[self]: print['Going']
84 của lớpCode language: Python [python]
class ChildClass[ParentClass1, ParentClass2, ParentClass3]: pass
2Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
Thứ ba, thêm phương thức
87 vào lớpCode language: Python [python]
class Car: def go[self]: print['Going']
2Code language: Python [python]
class Flyable: def fly[self]: print['Flying']
5Code language: Python [python]
class Car: def go[self]: print['Going']
Độ phân giải thứ tự phương thức của lớp
2 làCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
0Code language: Python [python]
class Car: def go[self]: print['Going']
24 gọiCode language: Python [python]
class Car: def go[self]: print['Going']
87 của lớpCode language: Python [python]
class Car: def go[self]: print['Going']
2. Do đó, bạn cần truyền đối sốCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
27 cho phương thứcCode language: Python [python]
class Car: def go[self]: print['Going']
87Code language: Python [python]
class Car: def go[self]: print['Going']
Bởi vì lớp
2 không thể truy cập phương thứcCode language: Python [python]
class Flyable: def fly[self]: print['Flying']
87 của lớpCode language: Python [python]
class Car: def go[self]: print['Going']
8, bạn cần khởi tạo các thuộc tínhCode language: Python [python]
class Car: def go[self]: print['Going']
82 vàCode language: Python [python]
class Car: def go[self]: print['Going']
83 riêng lẻCode language: Python [python]
class Car: def go[self]: print['Going']