Đa hình 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.
Đa hình hàm
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()
.
Sợi dây
Đối với chuỗi len()
trả về số ký tự:
Bộ dữ liệu
Đối với bộ dữ liệu len()
trả về số mục trong bộ dữ liệu:
Từ điển
Đối với từ điển len()
trả về số cặp khóa/giá trị trong từ điển:
Ví dụ
thisdict = {
"brand": "Ford",
"model": "Mustang",
"year": 1964
}
print(len(thisdict))
Hãy tự mình thử » Đ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à tất cả chúng đều có một phương thức gọi là move()
:
Ví dụ
Các lớp khác nhau có cùng một phương thức:
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()
Hãy tự mình thử »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 các lớp con Car
, Boat
, Plane
của Vehicle
, các lớp con sẽ kế thừa các phương thức Vehicle
nhưng có thể ghi đè chúng:
Ví dụ
Tạo một lớp có tên Vehicle
và tạo các lớp con Car
, Boat
, Plane
của Vehicle
:
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()
Hãy tự mình thử »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
trống, nhưng nó kế thừa brand
, model
và move()
từ Vehicle
.
Các lớp Boat
và 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.