Hiểu Biết Sâu Về Hệ Thống Lớp Trong Python

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 type thay 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.

Thẻ: python-oop mro-algorithm python3-migration unicode-handling AsyncIO

Đăng vào ngày 2 tháng 7 lúc 07:32