Abstract method dan @dataclass
Kontrak wajib via ABC, dan boilerplate yang hilang via dataclass.
Pahami konsepnya
Abstract Base Class (ABC) mendefinisikan kontrak yang HARUS dipenuhi class anak: method bertanda @abstractmethod wajib dioverride — lupa berarti error saat instansiasi. Ini berbeda dari duck typing murni: ABC memaksa kepatuhan sejak desain.
from abc import ABC, abstractmethod; class Bentuk(ABC): lalu @abstractmethod def luas(self): pass. Semua class anak (Persegi, Lingkaran) WAJIB implement luas() sendiri — setiap bentuk punya cara menghitungnya.
@dataclass (Python 3.7+) menghapus boilerplate constructor: @dataclass di atas class otomatis membuat __init__, __repr__, dan __eq__ dari type annotations. Class data 10 baris menjadi 4 baris — sangat populer untuk model data dan DTO.
Coba contoh kode
from abc import ABC, abstractmethod
class Bentuk(ABC):
@abstractmethod
def luas(self): pass
class Persegi(Bentuk):
def __init__(self, sisi):
self.sisi = sisi
def luas(self):
return self.sisi ** 2
print(Persegi(4).luas()) # 16
# dataclass: boilerplate hilang
from dataclasses import dataclass
@dataclass
class Produk:
nama: str
harga: int
stok: int = 0
p = Produk("Kopi", 18000)
print(p) # Produk(nama='Kopi', harga=18000, stok=0)Bentuk(ABC) memaksa Persegi mengimplementasikan luas(). @dataclass menghasilkan constructor, repr, dan eq dari annotations — bandingkan dengan versi manual yang butuh 10+ baris. Default value stok=0 bekerja seperti parameter biasa.
Latihan singkat
Uji: @dataclass Siswa — Siswa("Ari", 95) harus `Siswa(nama='Ari', poin=95)`.