Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass
Lớp dữ liệu trong Python là các lớp thông thường được thiết kế chủ yếu để lưu trữ trạng thái (state) thay vì xử lý logic phức tạp. Nếu bạn cần một lớp chỉ chứa các thuộc tính mà không yêu cầu nhiều phương thức, bạn có thể sử dụng lớp dữ liệu để đơn giản hóa công việc.
Module dataclasses
trong Python giúp dễ dàng tạo lớp dữ liệu bằng cách tự động thêm các phương thức đặc biệt như __init__()
và __repr__()
vào lớp do người dùng định nghĩa. Ngoài ra, module này còn cung cấp một số chức năng bổ sung rất tiện lợi.
Lớp thông thường không sử dụng dataclass
trong Python
Dưới đây là ví dụ về cách định nghĩa một lớp thông thường. Bạn cần tự viết các phương thức như __init__()
và __repr__()
để đạt được chức năng mong muốn:
class Student: def __init__(self, id, name): # Các biến instance self.id = id self.name = name def __repr__(self): return f"Thông tin sinh viên: id={self.id}, name={self.name}" student = Student(22, "Paul") print(student)
Kết quả:
Bài viết này được đăng tại [free tuts .net]
Thông tin sinh viên: id=22, name=Paul
Sử dụng @dataclass
trong Python
Bây giờ, hãy xem cách sử dụng @dataclass
để đạt được kết quả tương tự nhưng với ít mã hơn:
from dataclasses import dataclass @dataclass class Student: id: int name: str student = Student(22, "Paul") print(student)
Kết quả:
Student(id=22, name='Paul')
Ở đây, bạn không cần định nghĩa các phương thức như __init__()
hay __repr__()
vì @dataclass
đã tự động tạo ra chúng.
Giá trị mặc định trong dataclass
Bạn có thể đặt giá trị mặc định cho các thuộc tính để không cần truyền chúng vào hàm khởi tạo. Ví dụ:
from dataclasses import dataclass @dataclass class Student: id: int name: str = "John" student = Student(22) print(student)
Kết quả:
Student(id=22, name='John')
Lưu ý: Các thuộc tính có giá trị mặc định phải được khai báo sau các thuộc tính không có giá trị mặc định. Nếu không, Python sẽ báo lỗi.
Lớp dữ liệu không thể thay đổi (Immutable/Frozen Data Classes
) trong Python
Để tạo các đối tượng không thể thay đổi (immutable), bạn có thể đặt tham số frozen=True
trong decorator @dataclass
. Khi đó, các giá trị thuộc tính chỉ có thể được đọc mà không thể sửa đổi sau khi đối tượng được tạo.
Ví dụ:
from dataclasses import dataclass @dataclass(frozen=True) class Student: id: int name: str = "John" student = Student(22, "Paul") student.id = 20 # Lỗi
Kết quả:
dataclasses.FrozenInstanceError: cannot assign to field 'id'
Chuyển đổi lớp dữ liệu thành tuple hoặc dictionary
Module dataclasses
cung cấp hai hàm tiện lợi là astuple()
và asdict()
để chuyển đổi một đối tượng dataclass
thành tuple hoặc dictionary.
Ví dụ:
from dataclasses import dataclass, astuple, asdict @dataclass class Student: id: int name: str student = Student(22, "Paul") print("Tuple:", astuple(student)) print("Dictionary:", asdict(student))
Tham số tùy chọn trong @dataclass
trong Python
Cú pháp đầy đủ của decorator @dataclass
bao gồm các tham số tùy chọn sau:
@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False)