Vấn đề kim cương xảy ra khi hai lớp có một lớp cha chung và một lớp khác có cả hai lớp đó làm lớp cơ sở. Vấn đề kim cương là thuật ngữ thường được sử dụng cho sự mơ hồ phát sinh khi hai lớp B và C kế thừa từ một lớp cha A và một lớp D khác kế thừa từ cả B và C
Mã nguồn
class A: def display[self]: print["I am the display of Class A"] class B[A]: def display[self]: print["I am the display of Class B"] class C[A]: def display[self]: print["I am the display of Class C"] class D[B, C]: def display[self]: print["I am the display of Class D"] o = D[] o.display[]Để tải xuống tệp thô Bấm vào đây
đầu ra
I am the display of Class D
Danh sách chương trình
Chương trình mẫu
Kết nối cơ sở dữ liệu Python
bình trăn
Hướng dẫn Python Tkinter
Chuyển đến nội dung chínhGiới thiệu về Python
Nắm vững kiến thức cơ bản về phân tích dữ liệu với Python chỉ trong bốn giờ. Khóa học trực tuyến này sẽ giới thiệu giao diện Python và khám phá các gói phổ biến
Python trung cấp
Nâng cao kỹ năng khoa học dữ liệu của bạn bằng cách tạo trực quan hóa bằng Matplotlib và thao tác với DataFrames bằng gấu trúcCó liên quan
Dữ liệu văn bản trong Python Cheat Sheet
Chào mừng bạn đến với bảng gian lận của chúng tôi để làm việc với dữ liệu văn bản trong Python. Chúng tôi đã biên soạn một danh sách các hàm và gói hữu ích nhất để dọn dẹp, xử lý và phân tích dữ liệu văn bản trong Python, cùng với các ví dụ và giải thích rõ ràng, vì vậy bạn sẽ có mọi thứ cần biết về cách làm việc với dữ liệu văn bản trong Python.Hướng dẫn về tập hợp và lý thuyết tập hợp trong Python
Tìm hiểu về bộ Python. chúng là gì, cách tạo chúng, khi nào sử dụng chúng, các chức năng tích hợp và mối quan hệ của chúng với các hoạt động lý thuyết thiết lậpHướng dẫn về gấu trúc. Khung dữ liệu trong Python
Khám phá phân tích dữ liệu với Python. Pandas DataFrames giúp thao tác dữ liệu của bạn dễ dàng, từ việc chọn hoặc thay thế các cột và chỉ mục để định hình lại dữ liệu của bạnXem ThêmXem ThêmTôi đoán bạn ở đây để giải quyết một vấn đề cụ thể mà bạn đang gặp phải với tính kế thừa Python và bạn có thể đã bắt gặp thuật ngữ MRO [Thứ tự giải quyết phương pháp]. Tôi đã viết blog này khi tôi gặp phải một vấn đề tương tự. D
Vì vậy, khi một lớp kế thừa từ nhiều lớp và nếu cùng một phương thức [hoặc thuộc tính] được định nghĩa trong nhiều hơn một trong các lớp cha, thứ tự mà trình thông dịch Python tìm kiếm một thành viên trong hệ thống phân cấp của các lớp được gọi là nhiều độ phân giải
Hãy khám phá ba trường hợp kế thừa với các ví dụ và xem MRO hoạt động như thế nào
Trường hợp 1. trường hợp đơn giản nhấtQuả sung. 1
Xem xét kịch bản kế thừa đa cấp đã cho như trong Hình 1. Cả hai lớp A và B đều có tên thuộc tính và C thì không. Khi c. tên được gọi, trước tiên trình thông dịch sẽ kiểm tra tên thuộc tính trong B, Nếu không tìm thấy, nó sẽ kiểm tra trong A
#simple multilevel inheritanceclass A: name='A'
class B[A]: name = 'B'
class C[B]: passprint[C.name]# Output
B
điều này là rõ ràng. Ở đây, MRO hoạt động theo thứ tự kế thừa
Trường hợp 2. Đa thừa kế
MRO đóng vai trò chính trong trường hợp đa thừa kế
Hãy tưởng tượng kịch bản đa kế thừa đơn giản này
đa thừa kế đơn giản
class A: name=’A’
class B: name=’B’
class C[A,B]: pass
print[C.name]Output:
A
Và nếu tôi thay đổi mã một chút,
class A: name=’A’
class B: name=’B’
class C[B,A]: pass
print[C.name]Output:
B
Thứ tự tra cứu theo chiều sâu từ trái sang phải trước. Hay nói cách khác thứ tự tra cứu là thứ tự thừa kế
trường hợp 3. Trương hợp đặc biệtBây giờ hãy xem một trường hợp đặc biệt của kế thừa đa cấp và đa cấp như hình bên dưới [xem Hình 3]. Đây là trường hợp MRO đặc biệt khi cùng một lớp cha xuất hiện nhiều lần trong cách tiếp cận theo chiều sâu. Đây được gọi là bài toán kim cương
Theo wikipedia,
“Vấn đề kim cương” [đôi khi được gọi là “Vấn đề kim cương chết chóc”] là một sự mơ hồ phát sinh khi hai lớp B và C kế thừa từ A, và lớp D kế thừa từ cả B và C. Nếu có một phương thức trong A mà B và C đã ghi đè và D không ghi đè lên phương thức đó, thì D sẽ kế thừa phiên bản nào của phương thức đó. của B hay của C?
Ở đây D kế thừa từ B và C. Và cả b và C đều kế thừa mẫu A. Vì vậy, chúng ta có thể nói A là tổ tiên của D theo hai cách [thông qua B và C]. Vì vậy, cách tiếp cận đầu tiên theo chiều sâu ngây thơ của chúng tôi sẽ không hoạt động trong trường hợp này. Xem mã dưới đây
class A: name= 'A'
class B[A]: pass
class C[A]: name= ‘C’
class D[B, C]: pass
print[ D.name]Output:
C
Nếu bạn in D. __mro__ bạn có thể thấy thứ tự trình thông dịch tìm kiếm tên
D.__mro__
[, , ,
, ]
Trong trường hợp này, cả B và C đều kế thừa từ A. Vì vậy, A nên đợi trước khi tất cả các lớp con của nó được kiểm tra. Sau khi kiểm tra B, lớp C sẽ được kiểm tra trước A vì C cũng kế thừa từ A
Hãy xem thêm một ví dụ không đơn giản về thừa kế
Mã cho hình trên là như đã cho
class X:
name = 'X'
class Y:
name = 'Y'
class Z:
name = 'Z'
class A[X, Y]:
name = 'A'
class B[Y, Z]:
pass
class M[B,A]:
pass
print[M.name]Output:
A
B được kiểm tra trước, Sau đó, theo độ sâu tiếp cận đầu tiên, Y nên được kiểm tra. Nhưng vì tất cả các lớp con của Y đều không được thăm nên không thể thực hiện được. Vì vậy, A được truy cập và tên được tìm thấy trong A và được kế thừa và in