Class dan Object Python: Dasar OOP + Contoh Program

Pelajari class dan object Python untuk OOP: __init__, self, atribut, method, inheritance, dan invarian objek lewat contoh program dompet digital.

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

Class di Python adalah cetak biru (blueprint) yang menggabungkan data (atribut) dan perilaku (method), sedangkan object adalah benda nyata yang dibuat dari class itu. Konsep ini menjadi dasar OOP (Object-Oriented Programming atau pemrograman berorientasi objek). Contohnya, class Dompet dapat menghasilkan banyak object dompet dengan saldo masing-masing.

Apa Itu Class dan Object?

Bayangkan cetakan kue. Cetakannya adalah class: ia menentukan bentuk, tetapi tidak bisa dimakan. Kue-kue yang dibuat dari cetakan itu adalah object: masing-masing nyata dan bisa diberi topping berbeda. Satu class dapat menghasilkan banyak object, dan setiap object menyimpan datanya sendiri.

Istilah Arti Contoh
Class cetak biru Dompet
Object/instance hasil cetakan dompet_rani = Dompet("Rani", 10000)
Atribut data milik object self.saldo
Method fungsi milik class setor(), tarik()
Constructor method pengisi keadaan awal __init__

Membuat Class Python Langkah demi Langkah

Contoh 1: Class Dompet

class Dompet:
    def __init__(self, pemilik, saldo=0):
        if saldo < 0:
            raise ValueError("saldo awal tidak boleh negatif")
        self.pemilik = pemilik
        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

    def __str__(self):
        return f"Dompet {self.pemilik}: Rp{self.saldo}"

dompet = Dompet("Rani", 10000)
dompet.setor(5000)
dompet.tarik(4000)
print(dompet)

Jejak saldo: 10000, lalu 15000 setelah setor, lalu 11000 setelah tarik. Method khusus __str__ menentukan tampilan object saat dicetak, sehingga keluarannya Dompet Rani: Rp11000.

Contoh 2: Dua object, dua keadaan

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

Keluaran: 3000 7000. Ketika a.setor(1000) dipanggil, self menunjuk ke a, jadi saldo b tidak tersentuh.

Invarian: Menjaga Object Tetap Valid

Invarian adalah aturan yang harus selalu benar sebelum dan sesudah setiap method. Untuk Dompet, invariannya "saldo tidak pernah negatif". Karena pemeriksaan dilakukan sebelum saldo diubah, operasi yang ditolak tidak meninggalkan object dalam keadaan setengah berubah.

try:
    dompet.tarik(20000)
except ValueError as e:
    print("Gagal:", e)
print(dompet.saldo)

Setelah Contoh 1, program ini mencetak Gagal: tarikan tidak sah lalu 11000: saldo tetap utuh.

Empat Pilar OOP Python

Pilar Arti singkat Pada contoh Dompet
Enkapsulasi data dan operasinya dibungkus bersama saldo diubah lewat setor dan tarik
Abstraksi pengguna cukup tahu cara pakai panggil tarik(5000) tanpa memikirkan pemeriksaannya
Pewarisan (inheritance) class baru mewarisi class lama DompetPelajar mewarisi Dompet
Polimorfisme method sama, perilaku berbeda tarik di DompetPelajar punya batas

Python tidak memiliki atribut yang benar-benar privat. Konvensinya, nama berawalan garis bawah seperti _saldo menandakan "jangan diubah langsung dari luar class".

Contoh 3: Inheritance dan super()

class DompetPelajar(Dompet):
    BATAS_TARIK = 50000

    def tarik(self, jumlah):
        if jumlah > self.BATAS_TARIK:
            raise ValueError(f"melebihi batas tarik {self.BATAS_TARIK}")
        super().tarik(jumlah)

dp = DompetPelajar("Bayu", 100000)
dp.tarik(30000)
print(dp.saldo)
try:
    dp.tarik(60000)
except ValueError as e:
    print("Gagal:", e)

DompetPelajar mewarisi semua method Dompet, lalu menimpa (override) method tarik. super().tarik(jumlah) memanggil versi induk agar pemeriksaan saldo tetap berlaku. Keluarannya 70000 lalu Gagal: melebihi batas tarik 50000.

Atribut Class vs Atribut Instance

Atribut yang ditulis langsung di badan class dipakai bersama oleh semua object. Ini berbahaya untuk data yang bisa berubah, seperti list:

class Keranjang:
    isi = []

    def tambah(self, barang):
        self.isi.append(barang)

a = Keranjang()
b = Keranjang()
a.tambah("buku")
print(b.isi)

Keluarannya ['buku'], padahal b tidak pernah menambah apa pun. Perbaikannya: buat list di dalam __init__ dengan self.isi = [], sehingga setiap object punya list sendiri.

Kesalahan yang Sering Terjadi

Ringkasan

  • Class adalah cetak biru; object adalah hasilnya dengan keadaan masing-masing.
  • __init__ mengisi keadaan awal; self menunjuk object yang sedang dipakai.
  • Method menjaga invarian dengan memeriksa sebelum mengubah data.
  • Inheritance memakai ulang class lama; super() memanggil method induk.

Materi Terkait

Method pada dasarnya adalah fungsi Python yang terikat pada object. Pemakaian raise ValueError berhubungan erat dengan try except Python. Untuk membuktikan bahwa invarian class benar-benar terjaga, tulis pengujian di materi unit test Python.

python · 26 baris
class Dompet:
    def __init__(self, pemilik, saldo=0):
        self.pemilik = pemilik
        self.saldo = saldo

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


class DompetPelajar(Dompet):
    BATAS_TARIK = 50000

    def tarik(self, jumlah):
        if jumlah > self.BATAS_TARIK:
            raise ValueError("melebihi batas tarik")
        super().tarik(jumlah)


for d in [Dompet("Rani", 80000), DompetPelajar("Bayu", 80000)]:
    try:
        d.tarik(60000)
        print(d.pemilik, "berhasil, sisa", d.saldo)
    except ValueError as e:
        print(d.pemilik, "gagal:", e)
Polimorfisme: method tarik yang sama, aturan berbeda

Sumber belajar

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

Latihan soal Class dan Object Python

Lembar kerja · jawab langsung di halaman ini

Soal
5

Memuat soal…