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
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():
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
isinstance(c, Cane) # True
isinstance(c, Animale) # True (anche la base)
isinstance(c, str) # Falseisinstance(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.
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
print(a.saluta()) # ogni oggetto risponde a suo modoMRO (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:
- nó trông đầu tiên trong ví dụ,
- sau đó trong lớp của nó,
- sau đó vào các lớp cơ sở theo thứ tự khai báo.
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
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)`.
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
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))`.
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
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()`.
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ử