- Bab 9 dari 11
- 30 menit
- 1 latihan kode
- 4 soal kuis
OOP: Class, Object, dan Empat Pilar
Di bab ini (6 bagian)
Tujuan bab ini
- Membedakan class dan object, lalu membuat class sendiri dengan
__init__,self, atribut, dan method. - Memakai pewarisan dan override untuk membuat class anak yang perilakunya berbeda (polimorfisme).
- Memahami enkapsulasi dengan konvensi
_namadan abstraksi lewat contoh rekening bank.
Kenapa perlu OOP?
Sampai bab sebelumnya, kamu menyimpan data di variabel, list, atau dictionary, lalu mengolahnya dengan fungsi. Cara itu sudah cukup untuk program kecil. Masalahnya muncul saat program membesar: data dan fungsi yang mengolahnya tersebar di mana-mana, dan kamu harus ingat fungsi mana yang cocok untuk data mana.
Pemrograman Berorientasi Objek (Object-Oriented Programming, OOP) mengumpulkan data dan perilaku yang saling berkaitan ke dalam satu wadah. Contohnya, sebuah rekening bank punya data (nama pemilik, saldo) dan perilaku (setor, tarik, cek saldo). Dengan OOP, semuanya dibungkus jadi satu.
Class dan object
Class adalah cetak biru. Object adalah wujud nyata yang dibuat dari cetak biru itu. Bayangkan class sebagai cetakan kue, dan object sebagai kue-kuenya. Satu cetakan bisa menghasilkan banyak kue, dan setiap kue boleh punya topping berbeda.
Output:
Beberapa istilah penting dari contoh di atas:
| Istilah | Arti | Contoh |
|---|---|---|
| Class | Cetak biru objek | class Kucing: |
| Object | Wujud dari class | milo = Kucing("Milo", 2) |
__init__ | Konstruktor, jalan otomatis saat objek dibuat | def __init__(self, nama, umur): |
self | Merujuk ke objek itu sendiri | self.nama = nama |
| Atribut | Data milik objek | milo.nama, milo.umur |
| Method | Fungsi milik objek | milo.perkenalan() |
Memahami self
Saat kamu menulis milo.perkenalan(), Python sebenarnya memanggil Kucing.perkenalan(milo). Objek milo otomatis dikirim sebagai parameter pertama, dan parameter itu kita beri nama self. Karena itu setiap method di dalam class menulis self sebagai parameter pertama, walaupun kamu tidak mengisinya saat memanggil.
Nama self sebenarnya hanya kesepakatan, tapi semua programmer Python memakainya. Jangan diganti supaya kodemu mudah dibaca orang lain.
Setiap object punya data sendiri
Atribut yang dibuat lewat self menempel di masing-masing objek. Mengubah data satu objek tidak memengaruhi objek lain dari class yang sama:
Output:
Fungsi isinstance() mengecek apakah sebuah objek dibuat dari class tertentu. Ini berguna saat kamu ingin memastikan jenis data sebelum mengolahnya.
Empat pilar OOP
| Pilar | Inti |
|---|---|
| Enkapsulasi | Membungkus data dan method dalam satu class |
| Pewarisan | Class anak mewarisi atribut dan method induk |
| Polimorfisme | Method dengan nama sama, perilaku berbeda |
| Abstraksi | Menyembunyikan detail rumit di balik method sederhana |
Pewarisan dan polimorfisme
Dengan pewarisan, kamu tidak perlu menulis ulang kode yang sama. Class anak menulis nama induk di dalam kurung.
Output:
Kucing dan Anjing tidak menulis __init__ sendiri, tapi tetap punya atribut nama karena mewarisinya dari Hewan. Keduanya menulis ulang method suara(). Ini disebut override. Hasilnya, perulangan di atas cukup memanggil h.suara() tanpa peduli jenis hewannya, dan setiap objek menjawab dengan caranya sendiri. Itulah polimorfisme.
Kalau class anak butuh __init__ sendiri, panggil konstruktor induk dengan super():
Enkapsulasi dan abstraksi: contoh rekening bank
Saldo rekening sebaiknya tidak diubah sembarangan dari luar. Python tidak punya kata kunci private seperti Java. Sebagai gantinya ada konvensi: nama atribut yang diawali satu garis bawah, misalnya _saldo, berarti "ini untuk urusan internal, jangan diakses langsung". Python tidak melarangnya, tapi programmer lain akan paham maksudnya.
Output:
Di sini dua pilar bekerja sekaligus. Enkapsulasi: data _saldo dan aturan mengubahnya ada di satu tempat, jadi saldo tidak bisa negatif lewat tarik(). Abstraksi: pengguna class cukup memanggil setor() dan tarik() tanpa perlu tahu cara saldo dihitung di dalamnya. Kalau nanti aturannya berubah, misalnya ada biaya admin, kamu cukup mengubah isi method, dan kode yang memakai Rekening tidak perlu disentuh.
Kesalahan umum
- Lupa menulis
selfsebagai parameter pertama method, sehingga munculTypeError: ... takes 0 positional arguments but 1 was given. - Menulis
nama = namadi__init__alih-alihself.nama = nama. Nilainya hanya jadi variabel lokal dan hilang setelah konstruktor selesai. - Salah ketik
__init__menjadi_init_atau__int__. Konstruktor tidak terpanggil dan objek tidak punya atribut yang diharapkan. - Memanggil method tanpa kurung, misalnya
rek.cek_saldo. Yang didapat adalah objek method, bukan nilainya. - Mengubah
_saldolangsung dari luar class. Python mengizinkannya, tapi aturan disetor()dantarik()jadi terlewati.
Rangkuman
- Class adalah cetak biru, object adalah wujudnya. Satu class bisa menghasilkan banyak object.
__init__adalah konstruktor yang jalan saat objek dibuat, danselfmerujuk ke objek itu sendiri.- Atribut menyimpan data objek, method adalah fungsi milik objek.
- Pewarisan memakai
class Anak(Induk):, override menulis ulang method induk, dan polimorfisme membuat method yang sama berperilaku beda di tiap class. - Enkapsulasi di Python memakai konvensi
_nama, sedangkan abstraksi menyembunyikan detail di balik method sederhana sepertisetor()dantarik().
Slide 23 sampai 24 dari deck Pemrograman Python: Dari Nol sampai Proyek Mini. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Class Rekening bank
Lengkapi class Rekening.
__init__(self, pemilik, saldo_awal=0)menyimpanpemilikdan saldo di atribut_saldo.setor(jumlah)menambah saldo jikajumlahlebih dari 0, lalu mengembalikan saldo terbaru.tarik(jumlah)mengurangi saldo dan mengembalikanTrue. Jika saldo tidak cukup, saldo tidak berubah dan kembalikanFalse.cek_saldo()mengembalikan saldo.
Cek pemahaman
1Apa peran `self` di dalam method sebuah class?
2Apa yang dicetak kode berikut?
class Hewan: def suara(self): return "..." class Anjing(Hewan): def suara(self): return "Guk" class Ikan(Hewan): pass for h in [Anjing(), Ikan()]: print(h.suara(), end=" ")3Atribut yang diawali satu garis bawah, seperti `_saldo`, sama sekali tidak bisa diakses dari luar class.
4Penulisan `class Kucing(Hewan):` adalah contoh pilar OOP yang mana?
