dataclasses เป็นโมดูลใหม่ที่เพิ่มเข้ามาในไลบรารีมาตรฐานของ Python ตั้งแต่เวอร์ชัน 3.7 มันกำหนด @dataclass มัณฑนากรที่สร้างเมธอดตัวสร้างโดยอัตโนมัติ __init__(), วิธีการแทนสตริง __repr__(), เมธอด __eq__() ซึ่งโอเวอร์โหลด ==โอเปอเรเตอร์ (และอีกสองสามรายการ) สำหรับคลาสที่ผู้ใช้กำหนด
มัณฑนากร dataclass มีลายเซ็นต่อไปนี้
dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
อาร์กิวเมนต์ทั้งหมดใช้ค่าบูลีนที่ระบุว่าเมธอดหรือเมธอดที่เกี่ยวข้องจะถูกสร้างขึ้นโดยอัตโนมัติหรือไม่
อาร์กิวเมนต์ 'init' จะเป็น True โดยค่าเริ่มต้น มันจะสร้างเมธอด __init__() สำหรับคลาสโดยอัตโนมัติ
ให้เรากำหนด class Student โดยใช้ dataclass decorator ดังนี้
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 เป็นจริงตามค่าเริ่มต้นเช่นกัน ดังนั้นเมธอด __repr__() จะถูกสร้างขึ้นโดยอัตโนมัติ __repr__() เป็นการแสดงสตริงอย่างเป็นทางการของอ็อบเจ็กต์ หากคลาสกำหนด __repr__() ไว้แล้ว พารามิเตอร์นี้จะถูกละเว้น
อาร์กิวเมนต์ eq เป็นค่าเริ่มต้น true สิ่งนี้จะสร้างเมธอด __eq__() โดยอัตโนมัติ วิธีการนี้ถูกเรียกเพื่อตอบสนองต่อตัวดำเนินการเปรียบเทียบเท่ากับ (==) อีกครั้ง หากคลาสกำหนด __eq__() ไว้แล้ว พารามิเตอร์นี้จะถูกละเว้น
หากพารามิเตอร์ 'order' เป็นจริง (ค่าดีฟอลต์คือ False) เมธอดมายากลสำหรับการเปรียบเทียบ __lt__(), __le__(), __gt__() และ __ge__() จะถูกสร้างขึ้นโดยอัตโนมัติ จะใช้โอเปอเรเตอร์เปรียบเทียบ <<=> ตอบ>=ตามลำดับ หากคำสั่งเป็นจริงและ eq เป็นเท็จ จะเกิด ValueError หากคลาสกำหนดเมธอดเหล่านี้ไว้แล้ว) ก็จะส่งผลให้ TypeError
อาร์กิวเมนต์ unsafe_hash หากเป็นเท็จ (ค่าเริ่มต้น) เมธอด __hash__() จะถูกสร้างขึ้นตามวิธีการตั้งค่า eq และการตรึงไว้
อาร์กิวเมนต์ที่หยุดนิ่ง:ถ้าเป็นจริง (ค่าเริ่มต้นคือ เท็จ) จะจำลองอินสแตนซ์ที่หยุดนิ่งแบบอ่านอย่างเดียว
>>> from data_class import Student >>> 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 ใหม่จากรายการของ tuples ที่กำหนดเป็นอาร์กิวเมนต์ของ field
>>> NewClass=dataclasses.make_dataclass('NewClass', [('x',int),('y',float)]) >>> n = NewClass(10,20) >>> n NewClass(x=10, y=20)