Python có thừa kế kim cương không?

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ính

Giớ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úc

Có 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ập

Hướ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ạn

Xem ThêmXem Thêm

Tô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ất

Quả 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]: pass
print[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ệt

Bâ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?

Quả sung. 3

Ở đâ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

Kế thừa kim cương trong Python là gì?

"Vấn đề kim cương" [đôi khi được gọi là "vấn đề kim cương chết người"] 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 . .

Python có vấn đề về kim cương không?

Sự mơ hồ của vấn đề kim cương không tồn tại trong python vì chúng tôi có thuộc tính __mro__ -- Thứ tự giải quyết phương pháp. Python có hàm super[] được sử dụng để tránh việc sử dụng lớp cơ sở hoặc lớp cha một cách rõ ràng.

Python có kiểu kế thừa nào?

Đó là bản chất chuyển tiếp . Nếu một lớp con kế thừa các thuộc tính của lớp cha thì tất cả các lớp con khác của lớp con cũng kế thừa các thuộc tính của lớp cha.

Python có thừa kế không?

Tính kế thừa cho phép chúng ta định nghĩa một lớp kế thừa tất cả các phương thức và thuộc tính từ một lớp khác . Lớp cha là lớp được kế thừa từ đó, còn được gọi là lớp cơ sở. Lớp con là lớp kế thừa từ lớp khác, còn gọi là lớp dẫn xuất.

Chủ Đề