Panduan Lengkap Pemrograman Berorientasi Objek OOP Python [Seri RPL #3]

Panduan Lengkap Pemrograman Berorientasi Objek OOP Python [Seri RPL #3]

[SERI RPL #Bagian 3/7 • Level Menengah]

Materi Sebelumnya: Baca panduan dasar fungsi dan koleksi data pada artikel Struktur Data Python Fungsi Modular: Panduan Efisien untuk Pengembang [Seri RPL #2].
⚡ Jawaban Cepat (Quick Takeaway): Pemrograman berorientasi objek OOP python adalah paradigma rekayasa perangkat lunak yang menstrukturkan kode ke dalam unit independen bernama class dan objek. Paradigma ini mengintegrasikan data (atribut) dan perilaku (metode) secara aman melalui enkapsulasi serta mempercepat ekspansi kode via pewarisan inheritance hierarkis.

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.

Sponsor / Iklan

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.

  1. Langkah 1: Perancangan Class Induk dan Konstruktor: Menetapkan atribut dasar seperti nomor rekening, nama pemilik, dan status saldo awal menggunakan konstruktor __init__.
  2. 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.
  3. Langkah 3: Membangun Metode Mutator (Setter) dan Aksesor (Getter): Menyediakan fungsi setor_tunai(), tarik_tunai(), serta dekorator @property untuk memverifikasi nominal transaksi legal.
  4. 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.
  5. 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}")
💡 Catatan Pendidik: Di Python, awalan double underscore (misal: __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.
Sponsor / Iklan

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

🔜 Materi Selanjutnya: Seri RPL Bagian 4 (Level Menengah) akan membahas Desain Basis Data Relasional MySQL/MariaDB: Normalisasi Database (1NF-3NF) dan Query SQL Kompleks. Pastikan Anda menguasai OOP Python ini karena model database nantinya akan diintegrasikan dengan Object-Relational Mapping (ORM)!