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ế.