Đa hình (Polymorphism) nghĩa là nhiều hình thức. Trong Python, cùng một toán tử hoặc hàm có thể hoạt động khác nhau tùy đối số. Cũng hữu ích khi tạo các lớp khác nhau có phương thức cùng tên, giúp tái sử dụng code và giảm độ phức tạp. Đa hình liên quan đến kế thừa.
Đa hình trong toán tử
Toán tử + cho kết quả khác nhau tùy kiểu dữ liệu: int + int = int, int + float = float, str + str = nối chuỗi. Điều này xảy ra tự động nhờ cách Python định nghĩa toán tử.
Ví dụ
a = 23 b = 11 c = 9.5 s1 = "Hello" s2 = "There!" print(a + b) print(type(a + b)) print(b + c) print(type(b + c)) print(s1 + s2) print(type(s1 + s2))
Kết quả:
Đầu ra
34 20.5 HelloThere!
Đa hình trong hàm built-in
Các hàm built-in như len() xử lý khác nhau tùy kiểu: chuỗi -> đếm ký tự, tuple/list -> đếm phần tử, dict -> đếm cặp khóa-giá trị.
Ví dụ
str = 'Hi There !'
tup = ('Mon','Tue','Wed','Thu','Fri')
lst = ['Jan','Feb','Mar','Apr']
dict = {'1D':'Line','2D':'Triangle','3D':'Sphere'}
print(len(str))
print(len(tup))
print(len(lst))
print(len(dict))
Kết quả:
Đầu ra
10 5 4 3
Đa hình trong phương thức tự định nghĩa
Tạo phương thức cùng tên trong các lớp khác nhau. Gọi phương thức qua tên lớp để có hành vi khác nhau. Ví dụ: lớp Rectangle và Circle cùng có perimeter() và area().
Ví dụ
from math import pi
class Rectangle:
def __init__(self, length, breadth):
self.l = length
self.b = breadth
def perimeter(self):
return 2 * (self.l + self.b)
def area(self):
return self.l * self.b
class Circle:
def __init__(self, radius):
self.r = radius
def perimeter(self):
return 2 * pi * self.r
def area(self):
return pi * self.r ** 2
rec = Rectangle(5, 3)
cr = Circle(4)
print("Chu vi hình chữ nhật:", rec.perimeter())
print("Diện tích hình chữ nhật:", rec.area())
print("Chu vi hình tròn:", cr.perimeter())
print("Diện tích hình tròn:", cr.area())
Kết quả:
Đầu ra
Chu vi hình chữ nhật: 16 Diện tích hình chữ nhật: 15 Chu vi hình tròn: 25.132741228718345 Diện tích hình tròn: 50.26548245743669