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

Lớp dữ liệu trong Python (dataclasses)


Mô-đun dataclasses là mô-đun mới được thêm vào thư viện chuẩn của Python kể từ phiên bản 3.7. Nó định nghĩa trình trang trí @dataclass tự động tạo phương thức khởi tạo __init__(), phương thức biểu diễn chuỗi __repr__(), phương thức __eq__() nạp chồng toán tử == (và một vài phương thức khác) cho lớp do người dùng định nghĩa.

Trình trang trí dataclass có chữ ký sau:

dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)

Tất cả các đối số nhận giá trị Boolean cho biết liệu phương thức ma thuật tương ứng có được tự động tạo hay không.

Đối số init mặc định là True. Nó sẽ tự động tạo phương thức __init__() cho lớp.

Hãy định nghĩa lớp Student sử dụng trình trang trí dataclass như sau:

from dataclasses import dataclass
@dataclass
class Student(object):
    name: str
    age: int
    percent: float

Phương thức __init__() tự động tạo giống như:

def __init__(self, name: str, age: int, percent: float):
    self.name = name
    self.age = age
    self.percent = percent

Nếu lớp tường minh định nghĩa phương thức __init__(), thì tham số init bị bỏ qua.

Đối số repr cũng mặc định là True. Do đó phương thức __repr__() sẽ được tự động tạo. __repr__() là biểu diễn chuỗi chính thức của đối tượng. Nếu lớp đã định nghĩa __repr__(), tham số này bị bỏ qua.

Đối số eq mặc định là True. Điều này sẽ tự động tạo phương thức __eq__(). Phương thức này được gọi khi so sánh bằng toán tử ==. Lại nữa, nếu lớp đã định nghĩa __eq__(), tham số này bị bỏ qua.

Nếu tham số order là True (mặc định là False), các phương thức ma thuật so sánh __lt__(), __le__(), __gt__(), và __ge__() sẽ được tự động tạo, chúng thực hiện các toán tử <, <=, > và >= tương ứng. Nếu order là True và eq là False, một ValueError được ném ra. Nếu lớp đã định nghĩa bất kỳ phương thức nào trong số này, sẽ dẫn đến TypeError.

Đối số unsafe_hash nếu False (mặc định), một phương thức __hash__() được tạo theo cách eq và frozen được thiết lập.

Đối số frozen: Nếu True (mặc định là False), mô phỏng các instance chỉ đọc (frozen).

>>> from dataclasses import dataclass
>>> @dataclass
... class Student:
...     name: str
...     age: int
...     percent: float
>>> s1 = Student('Naveen', 21, 50.50)
>>> s2 = Student('Mangesh', 20, 50.00)
>>> s1 == s2
False

asdict()

Hàm này chuyển đổi instance lớp thành đối tượng từ điển.

>>> import dataclasses
>>> dataclasses.asdict(s1)
{'name': 'Naveen', 'age': 21, 'percent': 50.5}

astuple()

Hàm này chuyển đổi instance lớp thành đối tượng tuple.

>>> dataclasses.astuple(s2)
('Mahesh', 20, 50.0)

make_dataclass()

Hàm này tạo một dataclass mới từ danh sách các tuple được đưa ra làm đối số fields.

>>> NewClass = dataclasses.make_dataclass('NewClass', [('x', int), ('y', float)])
>>> n = NewClass(10, 20)
>>> n
NewClass(x=10, y=20)