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;selfmenunjuk 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.
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)Sumber belajar
Penjelasan dan contoh disusun ulang untuk materi ini; sumber dapat dibuka untuk belajar lebih lanjut.
Latihan soal Class dan Object Python
- Soal
- 5
Memuat soal…