Chuyển đến nội dung chính
Mô-đun 7 · Bài học 2 trong tổng số 426/36 trong khóa học~12 min
Bài học theo mô-đun (2/4)

Kế thừa

Kế thừa cho phép bạn tạo một lớp mới (lớp con) kế thừa các thuộc tính và phương thức từ một lớp hiện có (lớp cơ sở), và có thể mở rộng hoặc ghi đè chúng.

Cú pháp cơ bản

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

    def saluta(self):
        return f"{self.nome} fa un verso"

class Cane(Animale):       # Cane EREDITA da Animale
    def saluta(self):       # OVERRIDE del metodo
        return f"{self.nome} dice WOOF!"

a = Animale("X")
c = Cane("Fido")
a.saluta()      # 'X fa un verso'
c.saluta()      # 'Fido dice WOOF!'

Cane kế thừa __init__ từ Animale mà không cần viết lại.

super(): gọi phương thức cơ sở

Khi bạn muốn mở rộng một phương thức cơ bản (không thay thế hoàn toàn nó), hãy sử dụng super():

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

class Cane(Animale):
    def __init__(self, nome, razza):
        super().__init__(nome)    # delega alla base
        self.razza = razza

c = Cane("Fido", "Labrador")
c.nome        # 'Fido'
c.razza       # 'Labrador'

isinstance: kiểm tra kiểu

Python
isinstance(c, Cane)        # True
isinstance(c, Animale)     # True (anche la base)
isinstance(c, str)         # False

isinstance(x, BaseClass) cũng nhận ra tất cả các lớp con: đây là những gì làm cho tính kế thừa trở nên hữu ích cho đa hình.

Python
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
    print(a.saluta())        # ogni oggetto risponde a suo modo

MRO (Thứ tự giải quyết phương thức) - tổng quan

Khi bạn có nhiều kế thừa, Python sẽ quyết định thứ tự cần tìm cho một phương pháp bằng cách tuân theo MRO, được tính toán bằng thuật toán C3. cho 95% trường hợp chỉ cần biết:

  1. nó trông đầu tiên trong ví dụ,
  2. sau đó trong lớp của nó,
  3. sau đó vào các lớp cơ sở theo thứ tự khai báo.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object là gốc của mọi lớp trong Python 3.

Đến lượt bạn

tập thể dục#python.m7.l2.e1
Nỗ lực: 0Đang tải…

Cho `lớp Xe: def __init__(self, brand): self.brand = brand`, xác định `Car(Vehicle)` với __init__(self, brand, model) gọi super().__init__ và lưu trữ self.model. Tạo `a = Car('Fiat', '500')` và đánh giá `(a.brand, a.model)`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

super().__init__(brand) thì self.model = model.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#python.m7.l2.e2
Nỗ lực: 0Đang tải…

Xác định `class Shape: def Area(self): trả về 0` và `class Square(Shape)` với __init__(self, side) và Area() trả về side * side. Tạo `q = Square(5)` và đánh giá bộ dữ liệu `(q.area(), isinstance(q, Shape))`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

self.side * self.side.

Giải pháp khả dụng sau 3 lần thử

Thử thách bổ sung

tập thể dục#python.m7.l2.e3
Nỗ lực: 0Đang tải…

Create a class `Square` that inherits from the `Rectangle` class (defined below). The constructor of `Square` must take a single parameter `side` and pass it to `super().__init__(side, side)`. Instantiate a square with side `6` in `sq` and evaluate `sq.area()`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Declare class Square(Rectangle): and call super().__init__(side, side) in the constructor.

Giải pháp khả dụng sau 3 lần thử