Dataclass & Type Hints
Menulis class data ringkas dengan @dataclass dan menambah anotasi tipe.
Type hints
Anotasi tipe mendokumentasikan tipe yang diharapkan pada variable, parameter, dan nilai kembalian:
nama: str = "Dina"
umur: int = 20
def luas(p: float, l: float) -> float:
return p * l
def rata(angka: list[float]) -> float:
return sum(angka) / len(angka)
Python tidak memaksa tipe saat berjalan. Manfaatnya: editor memberi saran dan peringatan lebih baik, alat seperti mypy/Pyright menemukan bug sebelum dijalankan, dan kode lebih mudah dipahami.
Tipe yang sering dipakai: int, float, str, bool, list[int], dict[str, int], tuple[int, str], set[str], dan X | None (Python 3.10+) untuk nilai opsional.
Masalah: class data yang bertele-tele
class Produk:
def __init__(self, nama, harga, stok=0):
self.nama = nama
self.harga = harga
self.stok = stok
def __repr__(self):
return f"Produk(nama={self.nama!r}, harga={self.harga!r}, stok={self.stok!r})"
def __eq__(self, lain):
return (self.nama, self.harga, self.stok) == (lain.nama, lain.harga, lain.stok)
Banyak kode berulang hanya untuk menyimpan data.
Solusi: @dataclass
from dataclasses import dataclass
@dataclass
class Produk:
nama: str
harga: int
stok: int = 0
p = Produk("Pensil", 2500)
print(p) # Produk(nama='Pensil', harga=2500, stok=0)
print(p == Produk("Pensil", 2500)) # True
Dekorator @dataclass membuat otomatis __init__, __repr__, dan __eq__ berdasarkan field yang kamu tulis.
Menambah method
@dataclass
class Produk:
nama: str
harga: int
stok: int = 0
def nilai_stok(self) -> int:
return self.harga * self.stok
Opsi berguna
@dataclass(frozen=True) # immutable, bisa jadi kunci dict
class Titik:
x: int
y: int
from dataclasses import field
@dataclass
class Keranjang:
item: list[str] = field(default_factory=list) # default mutable yang benar
Jangan menulis item: list = [] — default mutable dilarang (error), gunakan field(default_factory=...).
Berguna: asdict
from dataclasses import asdict
print(asdict(Produk("Pensil", 2500))) # {'nama': 'Pensil', 'harga': 2500, 'stok': 0}
Kapan memakai dataclass?
Saat class terutama berfungsi menyimpan data (DTO, konfigurasi, hasil query). Bila logika dan perilaku mendominasi, class biasa tetap pilihan baik.