dataclasses เป็นโมดูลใหม่ที่เพิ่มเข้ามาในไลบรารีมาตรฐานของ Python ตั้งแต่เวอร์ชัน 3.7 โมดูลนี้กำหนดตัวแต่ง (decorator) @dataclass ที่สร้างเมธอดแมจิกคอนสตรัคเตอร์ __init__(), เมธอดการแสดงสตริง __repr__(), เมธอด __eq__() ที่โอเวอร์โหลดออปเปอเรเตอร์ == (และอีกเล็กน้อย) ให้กับคลาสที่ผู้ใช้กำหนดขึ้นอัตโนมัติ
ตัวแต่ง dataclass มีลายเซ็นดังนี้:
dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
อาร์กิวเมนต์ทั้งหมดรับค่า Boolean ระบุว่าเมธอดแมจิกแต่ละเมธอดจะถูกสร้างอัตโนมัติหรือไม่
อาร์กิวเมนต์ 'init' เป็น True ตามค่าเริ่มต้น จะสร้างเมธอด __init__() ให้กับคลาสอัตโนมัติ
ลองกำหนดคลาส Student โดยใช้ตัวแต่ง dataclass ดังนี้:
from dataclasses import dataclass
@dataclass
class Student(object):
name: str
age: int
percent: float
เมธอด __init__() ที่สร้างอัตโนมัติจะเป็นดังนี้:
def __init__(self, name: str, age: int, percent: float):
self.name = name
self.age = age
self.percent = percent
หากคลาสกำหนดเมธอด __init__() เอง พารามิเตอร์ init จะถูกละเลย
อาร์กิวเมนต์ repr เป็น True ตามค่าเริ่มต้นเช่นกัน ดังนั้นเมธอด __repr__() จะถูกสร้างอัตโนมัติ __repr__() เป็นการแสดงสตริงอย่างเป็นทางการของอ็อบเจ็กต์ หากคลาสกำหนด __repr__() ไว้แล้ว พารามิเตอร์นี้จะถูกละเลย
อาร์กิวเมนต์ eq เป็น True ตามค่าเริ่มต้น จะสร้างเมธอด __eq__() อัตโนมัติ เมธอดนี้ถูกเรียกตอบสนองต่อออปเปอเรเตอร์เปรียบเทียบเท่ากัน (==) อีกครั้ง หากคลาสกำหนด __eq__() ไว้แล้ว พารามิเตอร์นี้จะถูกละเลย
หากพารามิเตอร์ 'order' เป็น True (ค่าเริ่มต้นคือ False) เมธอดแมจิกสำหรับการเปรียบเทียบ __lt__(), __le__(), __gt__(), และ __ge__() จะถูกสร้างอัตโนมัติ พวกเขาใช้งานออปเปอเรเตอร์เปรียบเทียบ < <= > และ >= ตามลำดับ หาก order เป็น True และ eq เป็น False จะเกิด ValueError หากคลาสกำหนดเมธอดเหล่านี้ไว้แล้ว จะเกิด TypeError
อาร์กิวเมนต์ unsafe_hash หากเป็น False (ค่าเริ่มต้น) เมธอด __hash__() จะถูกสร้างตามวิธีที่ eq และ frozen ถูกตั้งค่า
อาร์กิวเมนต์ frozen: หากเป็น True (ค่าเริ่มต้นคือ False) จะจำลองอินสแตนซ์แบบอ่านอย่างเดียว (read-only frozen instances)
>>> 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()
ฟังก์ชันนี้แปลงอินสแตนซ์ของคลาสเป็นอ็อบเจ็กต์ดิกชันนารี:
>>> import dataclasses
>>> dataclasses.asdict(s1)
{'name': 'Naveen', 'age': 21, 'percent': 50.5}
astuple()
ฟังก์ชันนี้แปลงอินสแตนซ์ของคลาสเป็นอ็อบเจ็กต์ทูเพิล:
>>> dataclasses.astuple(s2)
('Mahesh', 20, 50.0)
make_dataclass()
ฟังก์ชันนี้สร้าง dataclass ใหม่จากรายการของทูเพิลที่ให้เป็นอาร์กิวเมนต์ fields:
>>> NewClass = dataclasses.make_dataclass('NewClass', [('x', int), ('y', float)])
>>> n = NewClass(10, 20)
>>> n
NewClass(x=10, y=20)