Đa hình là gì: Từ đa hình (polymorphism) có nghĩa là sở hữu nhiều dạng thức/hình thức. Trong lập trình, đa hình có nghĩa là cùng một tên hàm (nhưng khác signatures) được sử dụng cho nhiều kiểu dữ liệu khác nhau. 

1. Ví dụ về các hàm có tính đa hình được tích hợp sẵn  trong Python

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python program to demonstrate in-built poly- 
# morphic functions 
  
# len() being used for a string 
print(len("geeks")) 
  
# len() being used for a list 
print(len([10, 20, 30])) 

Kết quả in ra là:

5
3

2. Ví dụ về hàm có tính đa hình do người dùng tự định nghĩa


# A simple Python function to demonstrate  
# Polymorphism 
  
def add(x, y, z = 0):  
    return x + y+z 
  
# Driver code  
print(add(2, 3)) 
print(add(2, 3, 4)) 

Kết quả in ra là:

5
9

3. Đa hình với các phương thức của lớp

Đoạn code sau đây sẽ mô tả cách mà Python có thể sử dụng hai kiểu class khác nhau, theo cùng một cách. Chúng ta tạo ra một vòng lặp for để lặp qua một tuple chứa các đối tượng. Sau đó gọi đến các phương thức mong muốn, mà không cần phải lo về việc các đối tượng hiện tại thuộc kiểu class nào. Chúng ta sẽ giả sử rằng các phương thức này thực sự tồn tại bên trong mỗi lớp.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


class India(): 
    def capital(self): 
        print("New Delhi is the capital of India.") 
  
    def language(self): 
        print("Hindi is the most widely spoken language of India.") 
  
    def type(self): 
        print("India is a developing country.") 
  
class USA(): 
    def capital(self): 
        print("Washington, D.C. is the capital of USA.") 
  
    def language(self): 
        print("English is the primary language of USA.") 
  
    def type(self): 
        print("USA is a developed country.") 
  
obj_ind = India() 
obj_usa = USA() 
for country in (obj_ind, obj_usa): 
    country.capital() 
    country.language() 
    country.type() 

Kết quả in ra là

New Delhi is the capital of India.
Hindi is the most widely spoken language of India.
India is a developing country.
Washington, D.C. is the capital of USA.
English is the primary language of USA.
USA is a developed country.

4. Đa hình và Kế thừa

Trong Python, Đa hình cho phép chúng ta định nghĩa ra các phương thức trong lớp con mà có cùng tên với các phương thức trong lớp cha. Trong kế thừa, lớp con sẽ thừa kế các phương thức từ lớp cha. Tuy nhiên, ta hoàn toàn có thể chỉnh sửa các phương thức thuộc lớp con, mà được kế thừa lại từ lớp cha. Điều này đặc biệt hữ dụng trong những trường hợp mà phương thức được kế thừa lại từ lớp cha chưa thực sự phù hợp với lớp con. Trong những trường hợp như vậy, chúng ta sẽ cài đặt lại phương thức đó tại lớp con. Cái việc mà chúng ta cài đặt lại một phương thức được kế thừa từ lớp cha, tại lớp con, được gọi là ghi đè phương thức – Method Overriding.


class Bird: 
  def intro(self): 
    print("There are many types of birds.") 
      
  def flight(self): 
    print("Most of the birds can fly but some cannot.") 
    
class sparrow(Bird): 
  def flight(self): 
    print("Sparrows can fly.") 
      
class ostrich(Bird): 
  def flight(self): 
    print("Ostriches cannot fly.") 
      
obj_bird = Bird() 
obj_spr = sparrow() 
obj_ost = ostrich() 
  
obj_bird.intro() 
obj_bird.flight() 
  
obj_spr.intro() 
obj_spr.flight() 
  
obj_ost.intro() 
obj_ost.flight() 

Kết quả in ra là:

There are many types of birds.
Most of the birds can fly but some cannot.
There are many types of birds.
Sparrows can fly.
There are many types of birds.
Ostriches cannot fly.

5. Đa hình đối với một hàm và nhiều đối tượng

Chúng ta có thể tạo ra một hàm mà có khả năng nhận vào bất kỳ đối tượng thuộc kiểu class nào, nhằm thực hiện đa hình. Trong ví dụ ở mục này, chúng ta sẽ tạo ra một hàm có tên là ‘func()’ nhận vào một đối tượng tên là ‘obj’. Mặc dù chúng ta đang sử dụng cái tên ‘obj’ cho đối tượng được truyền vào hàm ‘func()’, nhưng bất cứ đối tượng được thể hiện thuộc kiểu class nào cũng đều có thể được truyền vào cho tham số ‘obj’.  Tiếp theo, giao cho hàm này thực hiện một tác vụ nào đó mà có sử dụng tới đối tượng ‘obj‘ mà chúng ta đã truyền vào. Trong trường hợp này, giả sử chúng ta gọi tới 3 phương thức là capital(), language() và type(), các phương thức này sẽ được định nghĩa trong class ‘India’ và class ‘USA’. Tiếp theo, tạo ra hai thể hiện của lớp ‘India’ và lớp ‘USA’. Với hai đối tượng vừa được thể hiện, chúng ta có thể khiến cho chúng “hành động” bằng cách cùng gọi đến hàm func():

Đoạn code sau sẽ cài đặt tính đa hình, chỉ bằng một hàm duy nhất


def func(obj): 
    obj.capital() 
    obj.language() 
    obj.type() 
   
obj_ind = India() 
obj_usa = USA() 
   
func(obj_ind) 
func(obj_usa) 

class India(): 
    def capital(self): 
        print("New Delhi is the capital of India.") 
   
    def language(self): 
        print("Hindi is the most widely spoken language of India.") 
   
    def type(self): 
        print("India is a developing country.") 
   
class USA(): 
    def capital(self): 
        print("Washington, D.C. is the capital of USA.") 
   
    def language(self): 
        print("English is the primary language of USA.") 
   
    def type(self): 
        print("USA is a developed country.") 
  
def func(obj): 
    obj.capital() 
    obj.language() 
    obj.type() 
   
obj_ind = India() 
obj_usa = USA() 
   
func(obj_ind) 
func(obj_usa) 

Kết quả in ra là:

New Delhi is the capital of India.
Hindi is the most widely spoken language of India.
India is a developing country.
Washington, D.C. is the capital of USA.
English is the primary language of USA.
USA is a developed country.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!