Ở bài này ta sẽ tìm hiểu về Đa hình trong python. Một tính chất giúp bạn tối ưu mã nguồn Python. Từ “đa hình” có nghĩa là “nhiều dạng” và trong lập trình, nó đề cập đến các phương thức/hàm/toán tử có cùng tên có thể được thực thi trên nhiều đối tượng hoặc lớp.
Hàm đa hình
Một ví dụ về hàm Python có thể được sử dụng trên các đối tượng khác nhau là hàm len().
- Đối với chuỗi, hàm len() trả về số lượng ký tự:
x = "Hello World!" print(len(x))
- Đối với tuple, hàm len() trả về số lượng phần tử trong tuple
mytuple = ("apple", "banana", "cherry") print(len(mytuple))
- Đối với Dictionary, hàm len() trả về số cặp khóa/giá trị trong Dictionary
thisdict = { "brand": "Ford", "model": "Mustang", "year": 1964 } print(len(thisdict))
Đa hình lớp
Tính đa hình thường được sử dụng trong các phương thức Class, trong đó chúng ta có thể có nhiều lớp có cùng tên phương thức.
Ví dụ: giả sử chúng ta có ba lớp: Car, Boat, và Plane, và chúng đều có một phương thức gọi là move():
class Car: def __init__(self, brand, model): self.brand = brand self.model = model def move(self): print("Drive!") class Boat: def __init__(self, brand, model): self.brand = brand self.model = model def move(self): print("Sail!") class Plane: def __init__(self, brand, model): self.brand = brand self.model = model def move(self): print("Fly!") car1 = Car("Ford", "Mustang") #Create a Car class boat1 = Boat("Ibiza", "Touring 20") #Create a Boat class plane1 = Plane("Boeing", "747") #Create a Plane class for x in (car1, boat1, plane1): x.move()
Nhìn vào vòng lặp for ở cuối. Do tính đa hình nên chúng ta có thể thực thi cùng một phương thức cho cả ba lớp.
Đa hình lớp kế thừa
Còn các lớp có lớp con cùng tên thì sao? Chúng ta có thể sử dụng đa hình ở đó không?
Đúng. Nếu chúng ta sử dụng ví dụ trên và tạo một lớp cha có tên là Vehicle, và tạo Car, Boat, Plane các lớp con của Vehicle, thì các lớp con sẽ kế thừa các phương thức Vehicle, nhưng có thể ghi đè chúng:
class Vehicle: def __init__(self, brand, model): self.brand = brand self.model = model def move(self): print("Move!") class Car(Vehicle): pass class Boat(Vehicle): def move(self): print("Sail!") class Plane(Vehicle): def move(self): print("Fly!") car1 = Car("Ford", "Mustang") #Create a Car object boat1 = Boat("Ibiza", "Touring 20") #Create a Boat object plane1 = Plane("Boeing", "747") #Create a Plane object for x in (car1, boat1, plane1): print(x.brand) print(x.model) x.move()
Lớp con kế thừa các thuộc tính và phương thức từ lớp cha.
Trong ví dụ trên, bạn có thể thấy lớp Car này trống nhưng nó kế thừa brand, model, và move() từ Vehicle.
Các lớp Boatand Plane cũng kế thừa brand, model, và move() từ Vehicle, nhưng cả hai đều ghi đè phương thức move().
Do tính đa hình nên chúng ta có thể thực thi cùng một phương thức cho tất cả các lớp.
Nếu bạn là newbie có thể tham khảo bài viết này để tìm hiểu lộ trình học DA trong 3 tháng của SmartData.
Nếu bạn thấy bài viết hay và hữu ích, bạn có thể tham gia các kênh sau của SmartData để nhận được nhiều hơn nữa: