Hướng dẫn can python classes inherit multiple classes? - các lớp python có thể kế thừa nhiều lớp không?

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.

Show

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.

Hướng dẫn can python classes inherit multiple classes? - các lớp python có thể kế thừa nhiều lớp không?
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.

Hướng dẫn can python classes inherit multiple classes? - các lớp python có thể kế thừa nhiều lớp không?
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

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
8. 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

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
8.

# 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

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
0, thứ tự tìm kiếm là [
# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
0,
# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
2,
# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
3,
class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
8]. Thứ tự này còn được gọi là tuyến tính hóa của lớp
# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
0 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

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
6 hoặc phương thức
# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
7. 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.

Hướng dẫn can python classes inherit multiple classes? - các lớp python có thể kế thừa nhiều lớp không?
Hình dung 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.

Bạn có thể có nhiều lớp trong Python không?

Như tất cả chúng ta đều biết, Python hỗ trợ nhiều kế thừa, có nghĩa là gì, trong Python, một lớp có thể kế thừa các tính năng và thuộc tính từ nhiều lớp.

  • Tại sao nhiều kế thừa không được hỗ trợ trong Python?
  • Nhiều kế thừa hữu ích trong nhiều tình huống như một nhà phát triển, nhưng nó làm tăng đáng kể sự phức tạp của ngôn ngữ, điều này làm cho cuộc sống khó khăn hơn cho cả nhà phát triển trình biên dịch và các lập trình viên. Một vấn đề xảy ra khi hai lớp cha có thành viên dữ liệu hoặc phương thức cùng tên.
  • Tổng thể

Giả sử mọi thứ đi xuống từ

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
8 (bạn tự mình nếu không), Python tính toán một thứ tự phân giải phương thức (MRO) dựa trên cây kế thừa lớp của bạn. MRO thỏa mãn 3 thuộc tính:

Trẻ em của một lớp đến trước cha mẹ của họ

Lưu ý rằng bạn có thể thấy MRO trong Python bằng cách sử dụng phương thức

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
6.

Ví dụ

Tất cả các ví dụ sau đây có một kế thừa kim cương của các lớp như vậy:

    Parent
    /   \
   /     \
Left    Right
   \     /
    \   /
    Child

MRO là:

  1. Đứa trẻ
  2. Bên trái
  3. Đúng
  4. Cha mẹ

Bạn có thể kiểm tra điều này bằng cách gọi

>>> MultiDerived.__mro__
(,
 ,
 ,
 )

>>> MultiDerived.mro()
[,
 ,
 ,
 ]
2, trả về:

(__main__.Child, __main__.Left, __main__.Right, __main__.Parent, object)

Với # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))9 đầu tiên trong mỗi phương thức

class Parent(object):
    def __init__(self):
        super(Parent, self).__init__()
        print("parent")

class Left(Parent):
    def __init__(self):
        super(Left, self).__init__()
        print("left")

class Right(Parent):
    def __init__(self):
        super(Right, self).__init__()
        print("right")

class Child(Left, Right):
    def __init__(self):
        super(Child, self).__init__()
        print("child")

>>> MultiDerived.__mro__
(,
 ,
 ,
 )

>>> MultiDerived.mro()
[,
 ,
 ,
 ]
4 Đầu ra:

parent
right
left
child
    

Với # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))9 cuối cùng trong mỗi phương thức

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
0

>>> MultiDerived.__mro__
(,
 ,
 ,
 )

>>> MultiDerived.mro()
[,
 ,
 ,
 ]
4 Đầu ra:

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
1

parent right left child

Với

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
9 cuối cùng trong mỗi phương thức

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
2

>>> MultiDerived.__mro__
(,
 ,
 ,
 )

>>> MultiDerived.mro()
[,
 ,
 ,
 ]
4 Đầu ra:

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
3

parent
right
left
child
    

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
4

Với

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
9 cuối cùng trong mỗi phương thức

Khi không phải tất cả các lớp đều gọi
# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
9

Lệnh kế thừa quan trọng nhất nếu không phải tất cả các lớp trong chuỗi kế thừa gọi # Output: True print(issubclass(list,object)) # Output: True print(isinstance(5.5,object)) # Output: True print(isinstance("Hello",object))9. Ví dụ: nếu >>> MultiDerived.__mro__ (, , , ) >>> MultiDerived.mro() [, , , ]9 không gọi Super, thì phương thức trên # 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())0 và # 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())1 không bao giờ được gọi:

Ngoài ra, nếu

# 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())
0 không gọi
# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))
9,
# 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())
1 vẫn bị bỏ qua:

Ở đây,

>>> MultiDerived.__mro__
(,
 ,
 ,
 )

>>> MultiDerived.mro()
[,
 ,
 ,
 ]
4 đầu ra:

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
6

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
5

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass
7

Một lớp có thể kế thừa từ nhiều lớp?

Bạn có thể lấy một lớp từ bất kỳ số lượng lớp cơ sở nào.Lấy một lớp từ nhiều lớp cơ sở trực tiếp được gọi là nhiều kế thừa.Deriving a class from more than one direct base class is called multiple inheritance.

Python có chấp nhận nhiều kế thừa không?

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.

Bạn có thể có nhiều lớp trong Python không?

Như tất cả chúng ta đều biết, Python hỗ trợ nhiều kế thừa, có nghĩa là gì, trong Python, một lớp có thể kế thừa các tính năng và thuộc tính từ nhiều lớp.Python supports multiple inheritance, what means, in Python, a class can inherit features and attributes from multiple classes.

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

Nhiều kế thừa hữu ích trong nhiều tình huống như một nhà phát triển, nhưng nó làm tăng đáng kể sự phức tạp của ngôn ngữ, điều này làm cho cuộc sống khó khăn hơn cho cả nhà phát triển trình biên dịch và các lập trình viên.Một vấn đề xảy ra khi hai lớp cha có thành viên dữ liệu hoặc phương thức cùng tên.