Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Python có hỗ trợ đa hình (polymorphism) không?

Có, Python hỗ trợ đầy đủ đa hình (polymorphism) - khả năng đối tượng khác nhau phản ứng khác nhau với cùng một thông điệp (method name).

Hai dạng chính

  • Overriding (Ghi đè): Lớp con định nghĩa lại phương thức của lớp cha.
  • Overloading (Nạp chồng): Python không hỗ trợ overloading truyền thống (cùng tên, khác tham số). Thay vào đó dùng *args, **kwargs hoặc default parameters.

Ví dụ Overriding (Polymorphism qua kế thừa)

class Fish:
    def swim(self):
        print("The Fish is swimming.")
    
    def swim_backwards(self):
        print("The Fish can swim backwards, but can sink backwards.")
    
    def skeleton(self):
        print("The fish's skeleton is made of cartilage.")

class Clownfish(Fish):
    def swim(self):
        print("The clownfish is swimming.")
    
    def swim_backwards(self):
        print("The clownfish can swim backwards.")
    
    def skeleton(self):
        print("The clownfish's skeleton is made of bone.")

# Polymorphism: cùng interface, hành vi khác
a = Fish()
b = Clownfish()

for fish in (a, b):
    fish.skeleton()
The fish's skeleton is made of cartilage.
The clownfish's skeleton is made of bone.

Duck Typing - "Nó kêu như vịt thì nó là vịt"

Python không yêu cầu kế thừa chung. Chỉ cần object có phương thức cần thiết:

class Duck:
    def quack(self): print("Quack!")
    def fly(self): print("Flap flap!")

class Person:
    def quack(self): print("Giả vờ quack")
    def fly(self): print("Vẫy tay bay")

def in_the_forest(duck):
    duck.quack()
    duck.fly()

in_the_forest(Duck())
in_the_forest(Person())
Quack!
Flap flap!
Giả vờ quack
Vẫy tay bay

Polymorphism với hàm built-in

Nhiều hàm built-in hoạt động đa hình: len() (str, list, dict), print(), str(), iter().

Tóm lại

  • Python hỗ trợ polymorphism mạnh mẽ nhờ dynamic typing và duck typing.
  • Overriding là dạng phổ biến nhất qua kế thừa.
  • Overloading truyền thống không có; dùng default args/*args/**kwargs thay thế.