Phân Biệt Lớp Cổ Điển và Lớp Kiểu Mới
Trong Python, sự khác biệt giữa lớp cổ điển (classic class) và lớp kiểu mới (new-style class) chủ yếu xuất phát từ cơ chế kế thừa và xử lý đối tượng.
Đặc điểm nhận diện
- Ở Python 2.x: Lớp kế thừa trực tiếp từ
objectđược xem là lớp kiểu mới. Ví dụ:class Entity(object): - Ở Python 3.x: Tất cả lớp đều ngầm định kế thừa từ
object, loại bỏ hoàn toàn lớp cổ điển
Khác biệt trong triển khai
Lớp cổ điển không hỗ trợ phương thức super() và thiếu nhiều tính năng quan trọng:
class BaseObject:
def __init__(self):
self.status = "Active"
class LegacyEntity:
def __init__(self):
# Không thể dùng super() ở lớp cổ điển
BaseObject.__init__(self) # Cách thay thế bắt buộc
class ModernEntity(BaseObject):
def __init__(self):
super().__init__() # Hoạt động bình thường ở lớp kiểu mới
self.timestamp = time.time()
Các tính năng chỉ có ở lớp kiểu mới:
- Thuộc tính
__slots__để giới hạn danh sách thuộc tính của instance - Phương thức
__getattribute__được gọi trước mọi thao tác truy cập thuộc tính - Kiểu lớp đồng nhất với
typethay vìclassobj
Thuật toán MRO và vấn đề kế thừa kim cương
Trong lớp cổ điển, thuật toán MRO (Method Resolution Order) sử dụng tìm kiếm ưu tiên chiều sâu gây lỗi khi xử lý kế thừa đa cấp:
class Top:
def show(self):
return "Top layer"
class Left(Top):
def show(self):
return "Left specialization"
class Right(Top):
pass
class Diamond(Left, Right):
pass
instance = Diamond()
print(instance.show()) # Trả về "Top layer" (sai) thay vì "Left specialization"
Vấn đề này được giải quyết trong lớp kiểu mới bằng thuật toán C3 Linearization, đảm bảo thứ tự gọi phương thức hợp lý theo thứ tự khai báo lớp cơ sở.
Khác biệt Trọng Tâm Giữa Python 2 và Python 3
Python 3 không chỉ là bản nâng cấp nhỏ mà là sự cải tiến nền tảng với các thay đổi không tương thích ngược:
Xử lý chuỗi và bytes
Python 3 tách biệt rõ ràng giữa kiểu str (Unicode) và bytes:
# Python 3
text = "Dữ liệu Unicode" # str (UTF-8)
binary = b"raw bytes" # bytes
# Python 2 (gây nhầm lẫn)
text = "Dữ liệu ASCII" # str (bytes)
unicode_text = u"Unicode" # unicode
Cải tiến cú pháp
- Print trở thành hàm:
print("Message")thay vì lệnh - Phép chia nguyên sử dụng
//, phép chia thực luôn trả về float - Hỗ trợ đầy đủ hàm annotation và type hinting
Tối ưu hiệu năng
Python 3 cải thiện đáng kể hiệu suất qua:
- Cơ chế quản lý bộ nhớ tối ưu
- Hỗ trợ async/await cho lập trình bất đồng bộ
- Thư viện chuẩn được chuẩn hóa (ví dụ:
io,datetime)
Python 2 đã ngừng hỗ trợ từ 2020, việc chuyển đổi sang Python 3 là bắt buộc cho các dự án hiện đại.