Kelas dan Invarian pada Objek

Kelola keadaan dan perilaku bersama, lalu jaga agar objek selalu valid.

Mapel
Pemrograman
Jenjang
Kuliah
Waktu baca
3 menit
Terbit
8 Oktober 2026

Tujuan belajar

Kamu dapat membuat instance kelas, menelusuri perubahan atribut melalui metode, serta merumuskan invarian sederhana.

Bekal awal

Kamu paham fungsi, parameter, percabangan, dan exception dasar Python. Kamu pernah menyimpan data dalam dictionary.

Satu objek, satu keadaan yang masuk akal

Kelas menggabungkan data dengan operasi yang mengubahnya. Sebagai contoh, rekening sederhana memiliki saldo dan metode setor serta tarik. Objek yang dibuat dari kelas disebut instance; setiap instance memiliki saldonya sendiri. Parameter self menunjuk ke instance yang sedang dipakai oleh metode. Dalam init, kita menetapkan keadaan awal. Ketika rekening_a.setor(5000) dipanggil, nilai yang diterima metode berkaitan dengan rekening_a, bukan semua rekening.

Aturan yang harus tetap benar sebelum dan sesudah operasi disebut invarian. Untuk contoh saldo tanpa pinjaman, aturannya saldo tidak negatif. Menulis atribut saldo secara bebas dari luar memudahkan pelanggaran aturan itu. Metode tarik dapat memeriksa jumlah yang diminta dan menolak operasi yang tidak sah. Contoh belajar ini masih sederhana; dalam aplikasi uang sungguhan perlu memperhatikan tipe desimal, transaksi serentak, penyimpanan, dan audit. Tujuan kita ialah memahami hubungan keadaan, operasi, dan aturan yang dapat diuji.

Contoh kerja 1: menyetor dan menarik

class Dompet:
    def __init__(self, saldo):
        self.saldo = saldo

    def setor(self, jumlah):
        if jumlah <= 0:
            raise ValueError("jumlah harus positif")
        self.saldo += jumlah

    def tarik(self, jumlah):
        if jumlah <= 0 or jumlah > self.saldo:
            raise ValueError("tarikan tidak sah")
        self.saldo -= jumlah

dompet = Dompet(10000)
dompet.setor(5000)
dompet.tarik(4000)
print(dompet.saldo)

Jejak saldo: awal 10000, setelah setor 15000, setelah tarik 11000. Keluaran “11000”. Nilai positif dan saldo cukup pada kedua operasi, sehingga tidak ada ValueError. Jika tarik 20000 dicoba setelah itu, syarat jumlah > saldo benar dan saldo tetap 11000 karena perubahan berada setelah pemeriksaan.

Contoh kerja 2: dua instance

a = Dompet(2000)
b = Dompet(7000)
a.setor(1000)
print(a.saldo, b.saldo)

Jejak: a mulai 2000 lalu menjadi 3000. b mulai 7000 dan tidak disentuh. Keluaran “3000 7000”. Contoh ini menunjukkan atribut instance berbeda, meskipun keduanya dibuat dari rancangan kelas yang sama.

Kesalahan umum dan debugging

Kesalahan umum ialah menulis saldo tanpa self di metode, sehingga Python mencari nama lokal yang tidak ada atau mengubah variabel yang salah. Kesalahan lain ialah menaruh saldo sebagai atribut kelas, lalu menyangka semua instance mendapat keadaan pribadi. Uji dua instance untuk mendeteksi kebocoran keadaan. Rumuskan invarian dalam kalimat yang dapat dicek: “saldo selalu >= 0”. Uji penarikan tepat sebesar saldo, satu lebih besar, nol, dan negatif. Pastikan operasi yang ditolak tidak mengubah saldo. Saat galat terjadi, lihat metode mana yang memicu exception dan keadaan objek sebelum pemanggilan.

Periksa keadaan setelah kegagalan

Objek yang baik tidak boleh berubah setengah jalan ketika operasi ditolak. Dalam contoh Dompet, pemeriksaan dilakukan sebelum pengurangan, jadi tarikan yang terlalu besar meninggalkan saldo seperti semula. Uji keadaan sebelum dan sesudah exception untuk membuktikan hal itu. Pada rancangan dengan beberapa atribut, misalnya saldo dan jumlah_transaksi, perhatikan urutan perubahan keduanya. Jika satu atribut sudah berubah lalu operasi gagal, invarian dapat rusak. Tentukan dulu apa yang harus benar pada akhir setiap metode, lalu letakkan pemeriksaan sebelum perubahan yang tidak boleh dibatalkan. Prinsip ini membantu membaca kode objek yang lebih besar.

Ringkasan dan latihan

Kelas menyatukan keadaan dan operasi; instance memiliki keadaan sendiri; metode menjaga invarian. Tambahkan pemeriksaan pada init agar saldo awal negatif ditolak. Buat dua dompet dengan saldo berbeda dan buktikan bahwa setor pada satu dompet tidak mengubah yang lain.

python · 18 baris
class Dompet:
    def __init__(self, saldo):
        self.saldo = saldo

    def setor(self, jumlah):
        if jumlah <= 0:
            raise ValueError("jumlah harus positif")
        self.saldo += jumlah

    def tarik(self, jumlah):
        if jumlah <= 0 or jumlah > self.saldo:
            raise ValueError("tarikan tidak sah")
        self.saldo -= jumlah

dompet = Dompet(10000)
dompet.setor(5000)
dompet.tarik(4000)
print(dompet.saldo)
Dompet dengan pemeriksaan operasi yang menjaga saldo

Sumber belajar

Penjelasan dan contoh disusun ulang untuk materi ini; sumber dapat dibuka untuk belajar lebih lanjut.

Cek pemahaman: Kelas dan Invarian pada Objek

Lembar kerja · jawab langsung di halaman ini

Soal
3

Memuat soal…