Đa Hình (Polymorphism) Trong Python Là Gì?
Đa hình, hay còn gọi là polymorphism, là một nguyên tắc cơ bản trong lập trình hướng đối tượng (OOP). Nguyên tắc này giúp lập trình viên viết phần mềm chất lượng cao hơn, linh hoạt hơn, và dễ dàng bảo trì, tái sử dụng cũng như kiểm thử và đọc hiểu. Hiểu rõ về đa hình sẽ giúp bạn có nền tảng vững chắc khi làm việc với các hệ thống phần mềm phức tạp.
Định Nghĩa Đa Hình
Từ "polymorphism" xuất phát từ tiếng Hy Lạp, có nghĩa là "có nhiều hình thức":
- Poly = nhiều
- Morph = hình thức
Trong ngữ cảnh lập trình, đa hình thể hiện khả năng của một đối tượng có thể có nhiều hình thức khác nhau. Nó cho phép chúng ta định nghĩa các hành vi chung trong một lớp cha, từ đó các lớp con có thể khai thác và ghi đè những hành vi này khi cần. Nhờ vào đa hình, mã nguồn của bạn sẽ trở nên rõ ràng hơn, giảm thiểu việc sử dụng các câu lệnh điều kiện (if-else) phức tạp, dễ dàng bảo trì và mở rộng.
Ý Nghĩa và Lợi Ích của Đa Hình
Khi làm việc với các framework như Django, bạn có thể thấy tính ứng dụng của đa hình. Django hỗ trợ nhiều loại cơ sở dữ liệu khác nhau như SQLite, MySQL và PostgreSQL. Thay vì phải viết mã riêng cho từng loại cơ sở dữ liệu, Django cung cấp một API chung, cho phép bạn thực hiện các thao tác mà không cần phải điều chỉnh mã quá nhiều khi chuyển đổi từ một cơ sở dữ liệu này sang cơ sở dữ liệu khác.
Ví Dụ Cụ Thể Với Đa Hình
Để minh họa về lợi ích của đa hình, chúng ta sẽ xem xét một ví dụ. Đầu tiên, hãy xem một đoạn mã đơn giản không sử dụng đa hình:
python
class Car:
def __init__(self, brand, model, year, number_of_doors):
self.brand = brand
self.model = model
self.year = year
self.number_of_doors = number_of_doors
def start(self):
print("Car is starting.")
def stop(self):
print("Car is stopping.")
python
class Motorcycle:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
def start_bike(self):
print("Motorcycle is starting.")
def stop_bike(self):
print("Motorcycle is stopping.")
Giả sử chúng ta muốn tạo một danh sách các phương tiện để kiểm tra. Ta cần phải kiểm tra từng loại phương tiện:
python
# Tạo danh sách các phương tiện để kiểm tra
vehicles = [
Car("Ford", "Focus", 2008, 5),
Motorcycle("Honda", "Scoopy", 2018),
]
# Lặp qua danh sách phương tiện và kiểm tra
for vehicle in vehicles:
if isinstance(vehicle, Car):
print(f"Inspecting {vehicle.brand} {vehicle.model} ({type(vehicle).__name__})")
vehicle.start()
vehicle.stop()
elif isinstance(vehicle, Motorcycle):
print(f"Inspecting {vehicle.brand} {vehicle.model} ({type(vehicle).__name__})")
vehicle.start_bike()
vehicle.stop_bike()
else:
raise Exception("Object is not a valid vehicle")
Như bạn thấy, các thủ tục kiểm tra kiểu đối tượng có thể trở nên cồng kềnh và khó duy trì khi thêm nhiều loại phương tiện mới.
Áp Dụng Đa Hình Để Đơn Giản Hóa Mã Nguồn
Bây giờ, hãy áp dụng đa hình để cải thiện mã nguồn:
python
class Vehicle:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
def start(self):
print("Vehicle is starting.")
def stop(self):
print("Vehicle is stopping.")
Và giờ đây, Car và Motorcycle có thể kế thừa từ lớp Vehicle:
python
class Car(Vehicle):
def __init__(self, brand, model, year, number_of_doors):
super().__init__(brand, model, year)
self.number_of_doors = number_of_doors
def start(self):
print("Car is starting.")
def stop(self):
print("Car is stopping.")
python
class Motorcycle(Vehicle):
def __init__(self, brand, model, year):
super().__init__(brand, model, year)
def start(self):
print("Motorcycle is starting.")
def stop(self):
print("Motorcycle is stopping.")
Bây giờ, khi tạo danh sách các phương tiện, mã trở nên sạch sẽ và ngắn gọn hơn:
python
# Tạo danh sách các phương tiện để kiểm tra
vehicles = [Car("Ford", "Focus", 2008, 5), Motorcycle("Honda", "Scoopy", 2018)]
# Lặp qua danh sách phương tiện và kiểm tra
for vehicle in vehicles:
print(f"Inspecting {vehicle.brand} {vehicle.model} ({type(vehicle).__name__})")
vehicle.start()
vehicle.stop()
Như vậy, ta có thể thêm một lớp mới, chẳng hạn như Plane, mà không làm thay đổi bất kỳ đoạn mã nào khác sử dụng để kiểm tra phương tiện. Đây chính là sức mạnh của đa hình.
Kết Luận
Đa hình không chỉ giúp mã nguồn trở nên dễ đọc và bảo trì hơn mà còn cho phép bạn mở rộng phần mềm một cách linh hoạt. Khi thêm các loại phương tiện mới vào hệ thống, bạn không cần phải sửa đổi mã đã tồn tại. Việc này giữ cho các khối mã của bạn luôn hoạt động ổn định và hiệu quả.
Hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về đa hình trong Python và cách áp dụng nó để tối ưu hóa quy trình lập trình của mình!
source: viblo