Hướng dẫn why multilevel inheritance is not supported in python? - tại sao thừa kế đa cấp không được hỗ trợ trong python?

Có, Python hỗ trợ nhiều kế thừa. Giống như C ++, một lớp có thể được lấy từ nhiều lớp cơ sở trong Python. Điều này được gọi là nhiều kế thừa.

Trong nhiều 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. Hãy cho chúng tôi xem cú pháp -

Cú pháp

Class Base1:
	Body of the class

Class Base2:
	Body of the class

Class Base3:
	Body of the class
.
.
.
Class BaseN:
	Body of the class


Class Derived[Base1, Base2, Base3,  , BaseN]:
	Body of the class

Lớp dẫn xuất kế thừa từ cả Base1, Base2 và Base3Classes.

Thí dụ

Trong ví dụ dưới đây, lớp chim thừa hưởng lớp động vật.

  • Animal là lớp cha mẹ còn được gọi là siêu lớp hoặc lớp cơ sở.

  • Bird là lớp trẻ em còn được gọi là lớp phụ hoặc lớp có nguồn gốc.

Phương pháp class đảm bảo rằng Bird là một lớp con của lớp động vật.

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

Đầu ra

True
It eats insects.
It sleeps in the night.
It flies in the sky.
It sings a song.
True

Cập nhật vào ngày 12 tháng 8 năm 2022 12:19:02

  • Câu hỏi và câu trả lời liên quan
  • Liệu kế thừa của MySQL hỗ trợ?
  • Java có hỗ trợ kế thừa lai không?
  • Java có hỗ trợ nhiều kế thừa không? Tại sao? Làm thế nào chúng ta có thể giải quyết điều này?
  • Python có hỗ trợ đa hình không?
  • Super [] của Python hoạt động như thế nào với nhiều kế thừa?
  • Làm thế nào để thừa kế lớp hoạt động trong Python?
  • C# và nhiều kế thừa
  • Java và nhiều kế thừa
  • Nhiều kế thừa trong C ++
  • Nhiều kế thừa trong JavaScript
  • JavaScript có hỗ trợ phạm vi khối không?
  • Selenium có hỗ trợ trình duyệt Safari không?
  • Làm thế nào chúng ta có thể mở rộng nhiều lớp Python trong kế thừa?
  • Nhiều kế thừa bằng giao diện trong Java
  • Sự khác biệt giữa đơn và nhiều kế thừa

Python Nhiều kế thừa

Một lớp có thể được lấy từ nhiều lớp cơ sở trong Python, tương tự như C ++. Điều này được gọi là nhiều kế thừa.

Trong nhiều 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 cho nhiều 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 nhiều người có nguồn gốc từ các lớp Base1 và Base2.

Nhiều kế thừa trong Python

Lớp nhiều người thừa kế từ cả hai lớp Base1 và Base2.

Kế thừa đa cấp Python

Chúng ta cũng có thể kế thừa từ một lớp học dẫn xuất. Điều này được gọi là kế thừa đa cấp. Nó có thể có 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.

Một ví dụ với trực quan tương ứng được đưa ra dưới đây.

class Base:
    pass

class Derived1[Base]:
    pass

class Derived2[Derived1]:
    pass

Ở đây, lớp dẫn xuất1 có nguồn gốc từ lớp cơ sở và lớp dẫn xuất2 có nguồn gốc từ lớp dẫn xuất1.

Di sản đa cấp trong Python

Thứ tự giải quyết phương pháp trong Python

Mỗi lớp học trong Python đều có nguồn gốc từ lớp object. Nó là loại 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ích hợp hoặc do người dùng xác định, là các lớp có nguồn gốc và tất cả các đối tượng là các trường hợp của lớp object.

# Output: True
print[issubclass[list,object]]

# Output: True
print[isinstance[5.5,object]]

# Output: True
print[isinstance["Hello",object]]

Trong kịch bản nhiều kế thừa, bất kỳ thuộc tính được chỉ định nào được tìm kiếm đầu tiên trong lớp hiện tại. Nếu không được tìm thấy, việc tìm kiếm tiếp tục vào các lớp phụ huynh ở thời trang sâu, trái phải mà không tìm kiếm cùng một lớp hai lần.

Vì vậy, trong ví dụ trên của lớp

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

1, thứ tự tìm kiếm là [

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

1,

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

3,

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

4, object]. Thứ tự này còn được gọi là tuyến tính hóa của lớp

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

1 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 thức [MRO].Method Resolution Order [MRO].

MRO phải ngăn chặn đặt hàng ư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 cha mẹ của nó. Trong trường hợp của nhiều phụ huynh, thứ tự giống như các bộ dữ liệu của các lớp cơ sở.

MRO của một lớp có thể được xem là thuộc tính

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

7 hoặc phương thức

class Animal: def eat[self]: print["It eats insects."] def sleep[self]: print["It sleeps in the night."] class Bird[Animal]: def fly[self]: print["It flies in the sky."] def sing[self]: print["It sings a song."] print[issubclass[Bird, Animal]] Koyal= Bird[] print[isinstance[Koyal, Bird]] Koyal.eat[] Koyal.sleep[] Koyal.fly[] Koyal.sing[]

8. Cái trước trả lại một tuple trong khi cái sau trả lại một danh sách.

>>> MultiDerived.__mro__
[,
 ,
 ,
 ]

>>> MultiDerived.mro[]
[,
 ,
 ,
 ]

Dưới đây là một ví dụ kế thừa đa dạng phức tạp hơn một chút và trực quan hóa của nó cùng với MRO.

Trực quan hóa nhiều kế thừa trong Python
# 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 toán MRO, hãy truy cập thảo luận về MRO.

Tại sao nhiều kế thừa không được hỗ trợ?

Java không hỗ trợ nhiều kế thừa trong các lớp vì nó có thể dẫn đến vấn đề kim cương và thay vì cung cấp một số cách phức tạp để giải quyết nó, có những cách tốt hơn để chúng ta có thể đạt được kết quả tương tự như nhiều kế thừa.it can lead to diamond problem and rather than providing some complex way to solve it, there are better ways through which we can achieve the same result as multiple inheritances.

Là thừa kế đa cấp được hỗ trợ trong Python?

Có, Python hỗ trợ nhiều kế thừa.Giống như C ++, một lớp có thể được lấy từ nhiều lớp cơ sở trong Python.Điều này được gọi là nhiều kế thừa.. Like C++, a class can be derived from more than one base classes in Python. This is called Multiple Inheritance.

Việc thừa kế nào không được hỗ trợ trong Python và tại sao?

Trả lời: Không giống như các ngôn ngữ lập trình hướng đối tượng khác như Java, Python hỗ trợ tất cả các loại kế thừa, thậm chí nhiều kế thừa!Và mặc dù C ++ cũng hỗ trợ loại kế thừa này, nhưng nó không có cùng cách tiếp cận tinh vi và được thiết kế tốt như Python.

Bài Viết Liên Quan

Chủ Đề