Xem lại cách ghi đè phương thức
Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 23 trên 64.
Đa hình có nghĩa là “nhiều hình thức” và cho phép các đối tượng thuộc những lớp khác nhau phản hồi khác nhau với cùng một lời gọi phương thức. Ghi đè phương thức giúp điều này trở nên khả thi.
Đây là một lớp cha có một phương thức:
class Animal:
def speak(self):
return "Animal makes a sound"Tạo các lớp con ghi đè cùng một phương thức:
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class Cow(Animal):
def speak(self):
return "Moo!"Mỗi lớp con cung cấp cách triển khai riêng cho speak().
Tạo một danh sách gồm nhiều loài động vật khác nhau:
animals = [Dog(), Cat(), Cow(), Animal()]Gọi cùng một phương thức trên tất cả đối tượng:
for animal in animals:
print(animal.speak())Đầu ra:
Woof!
Meow!
Moo!
Animal makes a soundĐây là tính đa hình đang hoạt động, cùng một lần gọi phương thức sẽ hoạt động khác nhau tùy vào kiểu thực tế của đối tượng.
Bạn cũng có thể dùng tính đa hình với các hàm:
def make_animal_speak(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
make_animal_speak(dog) # Gâu gâu!
make_animal_speak(cat) # Meo meo!Hàm không cần biết mình nhận được loại động vật nào, nó chỉ cần gọi speak() và nhận được hành vi phù hợp.
Điểm chính: Tính đa hình cho phép bạn xử lý các đối tượng khác nhau theo cùng một cách thông qua giao diện chung. Việc ghi đè phương thức cung cấp các cách triển khai khác nhau, còn tính đa hình cho phép bạn gọi chúng theo cùng một cách. Nhờ đó, code linh hoạt hơn và dễ mở rộng hơn.
Thử thách
Trung bìnhTrong thử thách này, bạn sẽ triển khai một hệ thống kế thừa cho phương tiện.
Bạn cần chỉnh sửa các tệp sau:
vehicle.py: Triển khai lớp cơ sởVehiclevới các thuộc tính make/model và các phương thứccar.py: Tạo lớpCarkế thừa từVehiclemotorcycle.py: Tạo lớpMotorcyclekế thừa từVehicletruck.py: Tạo lớpTruckkế thừa từVehicle
Mỗi tệp có các chú thích TODO chi tiết để hướng dẫn bạn triển khai từng bước. Hãy chú ý đến các câu lệnh import cần thiết giữa các tệp và làm theo các quan hệ kế thừa. Tệp driver.py có các test case để kiểm tra xem phần triển khai của bạn có hoạt động chính xác với tất cả các loại phương tiện hay không.
Tự làm thử
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from truck import Truck
def vehicle_info(vehicle):
return f"{vehicle.make} {vehicle.model}: {vehicle.start()}, Efficiency: {vehicle.fuel_efficiency()} mpg"
# Kiểm tra với nhiều loại xe khác nhau. KHÔNG CHỈNH SỬA ĐOẠN CODE KIỂM TRA NÀY
vehicles = [
Car("Toyota", "Camry"),
Motorcycle("Harley", "Davidson"),
Truck("Ford", "F-150"),
Vehicle("Generic", "Vehicle")
]
for v in vehicles:
print(vehicle_info(v))Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTham số selfPhương thứcThuộc tínhPhương thức khởi tạo (__init__)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnHàm super()Ghi đè phương thứcKế thừa đa lớpThứ tự phân giải phương thứcÔn tập: hệ thống phân cấp nhân viên2Decorator
Giới thiệu về decoratorDecorator thuộc tínhDecorator phương thức tĩnhDecorator phương thức lớp5Tính đa hình
Xem lại cách ghi đè phương thứcKiểu gõ vịtLớp và phương thức trừu tượngThiết kế giao diệnÔn tập: máy tính hình học8Các khái niệm OOP nâng cao
Kết hợp và kế thừaMixinPhương thức tĩnh và phương thức lớpDecorator lớpTrình quản lý ngữ cảnhTự luyện tập: Trình biên dịch Python online