[SERI RPL #Bagian 3/7 • Level Menengah]
Mengapa Paradigma OOP Krusial dalam Rekayasa Perangkat Lunak?
Ketika membangun program skala kecil, paradigma prosedural berbasis fungsi beruntun mungkin masih mudah dikelola. Namun, saat software berkembang menangani ribuan baris instruksi—seperti sistem perbankan mini, aplikasi point of sale (POS), atau sistem informasi sekolah—kode prosedural cenderung mengalami spaghetti code, duplikasi variabel global, dan kerentanan modifikasi liar.
Di sinilah pemrograman berorientasi objek OOP python mengambil peran sentral. Melalui konsep cetak biru (blueprint) yang memodelkan entitas dunia nyata, pengembang perangkat lunak dapat merancang arsitektur sistem yang modular, aman, dan mudah diperluas (maintainable). Pendekatan ini merupakan fondasi utama standar kompetensi kejuruan RPL menuju kualifikasi industri modern.
Pilar Utama Arsitektur OOP: Class, Object, Enkapsulasi, dan Inheritance
Konsep OOP dibangun di atas empat pilar utama, namun pada modul menengah ini kita membedah komponen paling fundamental: class dan objek, mekanisme proteksi data melalui enkapsulasi, serta hierarki kode dengan pewarisan inheritance.
| Konsep / Pilar | Definisi Teknis | Sintaks Kunci Python | Manfaat Praktis |
|---|---|---|---|
| Class | Cetak biru logis yang mendefinisikan atribut dan metode bawaan. | class NamaKelas: |
Standardisasi skema objek agar konsisten. |
| Object / Instance | Wujud fisik konkret di memori yang dibuat dari suatu class. | obj = NamaKelas() |
Menampung nilai data unik spesifik per entitas. |
| Enkapsulasi | Teknik isolasi status internal dan pembatasan akses data via getter/setter. | __saldo, @property |
Mencegah modifikasi status secara ilegal/korup. |
| Inheritance | Pewarisan properti dan fungsi dari superclass ke subclass. | class Anak(Induk):, super() |
Menghilangkan duplikasi kode (DRY principle). |
Langkah Kerja Praktik: Mengembangkan Sistem Bank Mini Sekolah
Untuk menguasai materi ini secara riil, kita akan menyelesaikan studi kasus oop smk: membangun modul sistem perbankan tabungan siswa SMK menggunakan Python standar industri.
- Langkah 1: Perancangan Class Induk dan Konstruktor: Menetapkan atribut dasar seperti nomor rekening, nama pemilik, dan status saldo awal menggunakan konstruktor
__init__. - Langkah 2: Menerapkan Prinsip Enkapsulasi Kuat: Mengubah atribut saldo menjadi atribut privat (private attribute berawalan
__) agar tidak bisa diubah langsung dari luar class tanpa validasi. - Langkah 3: Membangun Metode Mutator (Setter) dan Aksesor (Getter): Menyediakan fungsi
setor_tunai(),tarik_tunai(), serta dekorator@propertyuntuk memverifikasi nominal transaksi legal. - Langkah 4: Mengonstruksi Pewarisan Inheritance (Subclass): Membuat class turunan khusus, yaitu
RekeningTabunganSiswa, yang mewarisi seluruh kemampuan rekening umum namun memiliki fitur bunga otomatis dan limit penarikan. - Langkah 5: Instansiasi Objek dan Uji Kasus Nyata: Melakukan inisialisasi beberapa objek siswa, mengeksekusi serangkaian transaksi validasi, serta memastikan penanganan error berjalan semestinya.
Implementasi Kode: Rekening Bank Mini SMK
Buka teks editor atau IDE Anda (VS Code direkomendasikan), buat berkas baru bernama bank_smk.py, lalu ketik kode berikut:
# bank_smk.py - Studi Kasus OOP Python Tingkat Menengah
class RekeningBank:
def __init__(self, nomor_rekening: str, nama_pemilik: str, saldo_awal: float = 0.0):
self.nomor_rekening = nomor_rekening
self.nama_pemilik = nama_pemilik
# Enkapsulasi: Atribut saldo dibuat private dengan double underscore (__)
self.__saldo = float(saldo_awal) if saldo_awal >= 0 else 0.0
@property
def saldo(self) -> float:
"""Getter untuk membaca saldo secara aman."""
return self.__saldo
def setor(self, jumlah: float) -> bool:
if jumlah > 0:
self.__saldo += jumlah
print(f"[SETOR BERHASIL] Rp{jumlah:,.2f} masuk ke rek {self.nomor_rekening}.")
return True
print("[GAGAL] Nominal setoran harus bernilai positif!")
return False
def tarik(self, jumlah: float) -> bool:
if 0 < jumlah <= self.__saldo:
self.__saldo -= jumlah
print(f"[TARIK BERHASIL] Rp{jumlah:,.2f} ditarik dari rek {self.nomor_rekening}.")
return True
print(f"[GAGAL] Penarikan dibatalkan. Saldo tidak mencukupi atau nominal salah.")
return False
def info_akun(self):
return f"Rek: {self.nomor_rekening} | Pemilik: {self.nama_pemilik} | Saldo: Rp{self.__saldo:,.2f}"
# Penerapan Pewarisan Inheritance
class RekeningTabunganSiswa(RekeningBank):
def __init__(self, nomor_rekening: str, nama_pemilik: str, nisn: str, saldo_awal: float = 0.0):
# Memanggil konstruktor class induk menggunakan super()
super().__init__(nomor_rekening, nama_pemilik, saldo_awal)
self.nisn = nisn
self.limit_harian = 100000.0 # Limit penarikan tunai harian siswa
# Method Overriding untuk validasi limit siswa
def tarik(self, jumlah: float) -> bool:
if jumlah > self.limit_harian:
print(f"[LIMIT EXCEEDED] Penarikan Rp{jumlah:,.2f} melampaui limit harian siswa (Maks Rp{self.limit_harian:,.2f}).")
return False
return super().tarik(jumlah)
# Eksekusi dan Pengujian Objek
if __name__ == "__main__":
print("--- SIMULASI BANK MINI LAB RPL SMK ---")
siswa_1 = RekeningTabunganSiswa("SMK-001", "Budi Wicaksono", "0058291029", 50000)
print(siswa_1.info_akun())
siswa_1.setor(75000)
# Uji coba pelanggaran enkapsulasi langsung (Akan gagal mengubah saldo privat)
siswa_1.__saldo = 999999999 # Tidak mengubah status internal __saldo yang asli
# Uji validasi penarikan melebihi limit harian siswa
siswa_1.tarik(120000)
# Penarikan sah di bawah limit
siswa_1.tarik(30000)
print(f"Saldo Terkini Siswa: Rp{siswa_1.saldo:,.2f}")
__saldo) memicu mekanisme Name Mangling (secara internal diubah menjadi _RekeningBank__saldo). Jelaskan pada peserta didik bahwa enkapsulasi di Python didasarkan pada konvensi dan proteksi logis alih-alih proteksi keras seperti modifier private di Java atau C++. Dorong siswa membiasakan pemakaian dekorator @property untuk membuat API kode yang bersih.
Tanya Jawab Seputar pemrograman berorientasi objek OOP python (FAQ)
1. Kapan seorang programmer harus memilih OOP dibanding pemrograman fungsional/prosedural?
Gunakan paradigma OOP ketika sistem perangkat lunak Anda memodelkan entitas dunia nyata yang memiliki state (status/data yang terus berubah) dan behavior spesifik, seperti manajemen pengguna, transaksi inventaris, atau game engine. Sebaliknya, gunakan pemrograman prosedural/fungsional untuk tugas kalkulasi data murni (data pipelines) yang tidak memerlukan penyimpanan status objek.
2. Apa fungsi parameter ‘self’ pada setiap method dalam class Python?
Parameter self merupakan referensi eksplisit ke instansiasi objek yang sedang aktif memanggil metode tersebut. Melalui self, Python dapat membedakan atribut milik objek A dari objek B meskipun keduanya dicetak dari class yang sama di memori komputer.
3. Mengapa kita wajib menggunakan fungsi super() dalam pewarisan inheritance?
Fungsi super() digunakan untuk memanggil konstruktor atau metode dari kelas induk (superclass). Pendekatan ini memastikan bahwa inisialisasi awal pada class induk dieksekusi secara benar tanpa harus menulis ulang kode inisialisasi di dalam class anak (subclass).

![Panduan Lengkap Pemrograman Berorientasi Objek OOP Python [Seri RPL #3]](https://www.edusoe.my.id/wp-content/uploads/2026/10/blog_featured_1792558834-1024x538.jpg)
![Implementasi 6 Sintaks PjBL Kurikulum Merdeka SMK: Dari Pertanyaan Pemantik hingga Asesmen Otentik [Seri PJBL #1]](https://www.edusoe.my.id/wp-content/uploads/2026/10/blog_featured_1792585870-150x150.jpg)