Materi
Banyak kelas hanya menyimpan data: __init__ yang menyalin argumen ke atribut, __repr__ yang menampilkannya, dan __eq__ yang membandingkannya. Dekorator @dataclass dari modul dataclasses menuliskan ketiganya untukmu. Ia membaca baris berpenanda tipe di badan kelas, seperti judul: str, sebagai field, lalu membuat __init__ dengan parameter sesuai urutan field itu. __eq__ buatannya membandingkan semua field satu per satu.
from dataclasses import dataclass, field, asdict
@dataclass
class Buku:
judul: str
penulis: str
tahun: int
dipinjam: bool = False
peminjam: list = field(default_factory=list)
b = Buku("Bumi Manusia", "Pramoedya Ananta Toer", 1980)
print(b)
# Buku(judul='Bumi Manusia', penulis='Pramoedya Ananta Toer', tahun=1980, dipinjam=False, peminjam=[])
print(b == Buku("Bumi Manusia", "Pramoedya Ananta Toer", 1980)) # True
print(asdict(b)["tahun"]) # 1980Field bernilai bawaan ditulis setelah field tanpa nilai bawaan; urutan sebaliknya ditolak dengan TypeError: non-default argument 'b' follows default argument 'a'. Nilai bawaan yang bisa berubah seperti [] ditolak dengan ValueError, karena satu list itu akan dipakai bersama semua objek — masalah yang sama dengan atribut kelas di pelajaran 2. field(default_factory=list) membuat list baru untuk tiap objek. asdict(obj) mengubah objek menjadi dict, yang dipakai saat menyimpan ke JSON di modul 4.
Kapan dipakai: data berbentuk rekaman — buku, karyawan, transaksi — yang perlu ditampilkan dan dibandingkan. Method biasa tetap boleh ditulis di dalam kelas dataclass.