← Kembali ke kursus
Pelajaran kursus · Python
Pelajaran 30

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)`.