Đa kế thừa trong Python
Cải thiện bài viết
Lưu bài viết
Thích bài viết
- Độ khó. Dễ dàng
- Cập nhật lần cuối. 22 tháng 2 năm 2022
Cải thiện bài viết
Lưu bài viết
Kế thừa là cơ chế để đạt được khả năng sử dụng lại mã vì một lớp [lớp con] có thể lấy được các thuộc tính của lớp khác [lớp cha]. Nó cũng cung cấp tính bắc cầu tức là. nếu lớp C kế thừa từ P thì tất cả các lớp con của C cũng kế thừa từ P
Đa thừa kế
Khi một lớp được dẫn xuất từ nhiều hơn một lớp cơ sở, nó được gọi là đa kế thừa. Lớp dẫn xuất kế thừa tất cả các tính năng của trường hợp cơ sở
Syntax: Class Base1: Body of the class Class Base2: Body of the class Class Derived[Base1, Base2]: Body of the class
Trong phần tiếp theo, chúng ta sẽ xem vấn đề gặp phải trong quá trình đa thừa kế và cách giải quyết vấn đề đó với sự trợ giúp của các ví dụ
Vấn đề kim cương
Nó đề cập đến sự mơ hồ phát sinh khi hai lớp Class2 và Class3 kế thừa từ một lớp cha Class1 và lớp Class4 kế thừa từ cả Class2 và Class3. Nếu có một phương thức “m” là một phương thức bị ghi đè ở một trong hai Lớp 2 và Lớp 3 hoặc cả hai thì sẽ có sự không rõ ràng rằng phương thức nào trong số “m” Lớp 4 sẽ kế thừa
Khi phương thức bị ghi đè trong cả hai lớp
Python3
# Python Program to depict multiple inheritance
# when method is overridden in both classes
class
In Class20
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class29_______11_______0
In Class31
class
In Class33
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class12
In Class30
class
In Class4 In Class2 In Class3 In Class15
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class14_______22_______5
In Class4 In Class2 In Class3 In Class16
class
In Class4 In Class2 In Class3 In Class18
In Class21
In Class4 In Class2 In Class1 In Class3 In Class10
In Class21
In Class4 In Class2 In Class1 In Class3 In Class12
In Class4 In Class2 In Class1 In Class3 In Class13
In Class4 In Class2 In Class1 In Class3 In Class14
In Class4 In Class2 In Class1 In Class3 In Class15
đầu ra
In Class2
Ghi chú. Khi bạn gọi obj. m[] [m trong trường hợp của Lớp 4] đầu ra là Ở Lớp 2. Nếu Class4 được khai báo là Class 4[Class 3, Class 2] thì đầu ra của obj. m[] sẽ ở Lớp 3
Khi phương thức bị ghi đè ở một trong các lớp
Python3
# Python Program to depict multiple inheritance
In Class4 In Class2 In Class1 In Class3 In Class17
class
In Class20
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class29_______11_______0
In Class31
class
In Class33
In Class21
In Class4 In Class2 In Class1 In Class3 In Class10
class
In Class4 In Class2 In Class3 In Class15
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class14
# when method is overridden in both classes
6# when method is overridden in both classes
7
class
In Class4 In Class2 In Class3 In Class18
In Class21
In Class4 In Class2 In Class1 In Class3 In Class10
In Class4 In Class2 In Class1 In Class3 In Class12
In Class4 In Class2 In Class1 In Class3 In Class13
In Class4 In Class2 In Class1 In Class3 In Class14
In Class4 In Class2 In Class1 In Class3 In Class15
đầu ra
In Class3
Khi mọi lớp định nghĩa cùng một phương thức
Python3
# Python Program to depict multiple inheritance
class
7
class
In Class20
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class29_______11_______0
In Class31
class
In Class33
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class12
In Class30
class
In Class4 In Class2 In Class3 In Class15
In Class21
In Class22
In Class23
In Class24
In Class25
In Class230_______1_______7
In Class28
In Class4 In Class2 In Class3 In Class14
In Class234
In Class21
class
In Class4 In Class2 In Class3 In Class18
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class246
In Class247
In Class4 In Class2 In Class1 In Class3 In Class12
In Class4 In Class2 In Class1 In Class3 In Class13
In Class4 In Class2 In Class1 In Class3 In Class14
In Class4 In Class2 In Class1 In Class3 In Class15
In Class252
In Class253
In Class254
đầu ra
In Class4 In Class2 In Class3 In Class1
Đầu ra của phương thức obj. m[] trong đoạn mã trên là Lớp 4. Phương thức “m” của Class4 được thực thi. Để thực thi phương thức “m” của các lớp khác, có thể thực hiện bằng cách sử dụng tên lớp
Bây giờ, để gọi phương thức m cho Class1, Class2, Class3 trực tiếp từ phương thức “m” của Class4, hãy xem ví dụ bên dưới
Python3
# Python Program to depict multiple inheritance
In Class256
In Class257
In Class258
class
In Class20
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class29_______22_______5
# when method is overridden in both classes
7
class
In Class33
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class12
In Class30
class
In Class4 In Class2 In Class3 In Class15
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class14_______1_______34
In Class21
class
In Class4 In Class2 In Class3 In Class18
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class246
In Class247
In Class26
In Class310
In Class24
In Class30
In Class26
In Class314
In Class24
In Class30
In Class26
In Class318
In Class24
In Class30
In Class4 In Class2 In Class1 In Class3 In Class12
In Class4 In Class2 In Class1 In Class3 In Class13
In Class4 In Class2 In Class1 In Class3 In Class14
In Class4 In Class2 In Class1 In Class3 In Class15
đầu ra
In Class4 In Class2 In Class3 In Class1
Để gọi “m” của Lớp 1 từ cả “m” của Lớp 2 và “m” của Lớp 3 thay vì Lớp 4 được hiển thị bên dưới
Python3
# Python Program to depict multiple inheritance
In Class326
In Class327
class
In Class20
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class29_______1_______47
In Class21
class
In Class33
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class12
In Class30
In Class26
In Class318
In Class24
In Class30
class
In Class4 In Class2 In Class3 In Class15
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class14_______11_______0
In Class26
In Class318
In Class24
In Class247
# when method is overridden in both classes
7
class
In Class4 In Class2 In Class3 In Class18
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class246
In Class247
In Class26
In Class310
In Class24
In Class30
In Class26
In Class314
In Class24
In Class30
# when method is overridden in both classes
7
In Class4 In Class2 In Class1 In Class3 In Class12
In Class4 In Class2 In Class1 In Class3 In Class13
In Class4 In Class2 In Class1 In Class3 In Class14
In Class4 In Class2 In Class1 In Class3 In Class15
đầu ra
In Class4 In Class2 In Class1 In Class3 In Class1
Đầu ra của đoạn mã trên có một vấn đề liên quan đến nó, phương thức m của Class1 được gọi hai lần. Python cung cấp giải pháp cho vấn đề trên với sự trợ giúp của hàm super[]. Hãy xem nó hoạt động như thế nào
siêu chức năng
Python3
In Class399
In Class4 In Class2 In Class3 In Class100
class
In Class20
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class29_______11_______0
class
In Class33
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class12
In Class30
In Class26
In Class4 In Class2 In Class3 In Class126
In Class4 In Class2 In Class3 In Class127
class
In Class4 In Class2 In Class3 In Class15
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class14_______11_______0
In Class26
In Class4 In Class2 In Class3 In Class126
In Class4 In Class2 In Class3 In Class127
class
In Class4 In Class2 In Class3 In Class18
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class246
In Class247
In Class26
In Class4 In Class2 In Class3 In Class126
In Class4 In Class2 In Class3 In Class127
# when method is overridden in both classes
7
In Class4 In Class2 In Class1 In Class3 In Class12
In Class4 In Class2 In Class1 In Class3 In Class13
In Class4 In Class2 In Class1 In Class3 In Class14
In Class4 In Class2 In Class1 In Class3 In Class15
đầu ra
In Class4 In Class2 In Class3 In Class1
Super[] thường được sử dụng với chức năng __init__ khi khởi tạo phiên bản. Siêu chức năng đưa ra kết luận, phương thức nào sẽ gọi với sự trợ giúp của thứ tự giải quyết phương thức [MRO]
Thứ tự giải phương pháp
Trong Python, mọi lớp dù được tích hợp sẵn hay do người dùng định nghĩa đều được dẫn xuất từ lớp đối tượng và tất cả các đối tượng đều là 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 đa thừa kế, một thuộc tính nhất định được tìm kiếm đầu tiên trong lớp hiện tại nếu không tìm thấy nó thì nó được tìm kiếm trong các lớp cha. Các lớp cha được tìm kiếm theo kiểu trái phải và mỗi lớp được tìm kiếm một lần
Nếu chúng ta xem ví dụ trên thì thứ tự tìm kiếm các thuộc tính sẽ là Derived, Base1, Base2, object. Thứ tự được tuân theo được gọi là tuyến tính hóa của lớp Derived và thứ tự này được tìm ra bằng cách sử dụng một bộ quy tắc gọi là Thứ tự giải quyết phương pháp [MRO]
Để xem MRO của một lớp.
- Sử dụng phương thức mro[], nó trả về một danh sách
Ví dụ. lớp4. mro[] - Sử dụng thuộc tính _mro_, nó trả về một bộ
Ví dụ. lớp4. __mro__
Thí dụ.
Python3
In Class399
In Class4 In Class2 In Class3 In Class100
class
In Class20
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class29_______11_______0
class
In Class33
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class12
In Class30
In Class26
In Class4 In Class2 In Class3 In Class126
In Class4 In Class2 In Class3 In Class127
class
In Class4 In Class2 In Class3 In Class15
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class4 In Class2 In Class3 In Class14_______11_______0
In Class26
In Class4 In Class2 In Class3 In Class126
In Class4 In Class2 In Class3 In Class127
class
In Class4 In Class2 In Class3 In Class18
In Class21
In Class22
In Class23
In Class24
In Class25
In Class26
In Class27
In Class28
In Class246
In Class247
In Class26
In Class4 In Class2 In Class3 In Class126
In Class4 In Class2 In Class3 In Class127
# when method is overridden in both classes
7
In Class27
In Class4 In Class2 In Class3 In Class124
In Class4 In Class2 In Class3 In Class125
In Class27
In Class4 In Class2 In Class3 In Class127
In Class4 In Class2 In Class3 In Class128
đầu ra
[, , , , ]
[, , , , ]
Ghi chú cá nhân của tôi arrow_drop_up
Tiết kiệm