Pemrograman Berorientasi Objek (Object-Oriented Programming, OOP) adalah paradigma pemrograman yang berfokus pada objek—entitas yang memiliki data (atribut) dan perilaku (metode).
Pemrograman berorientasi objek sebetulnya tidak hanya digunakan pada Python, bahkan dalam banyak kasus, bahasa pemrograman seperti C++ dan Java lebih dulu dikenal ramah terhadap pengembangan dengan berorientasi objek.
Mengapa diperlukan?
Dengan OOP, program menjadi lebih mudah:
📌 Contoh sederhana analogi dunia nyata:
Mobil adalah objek. Benda tersebut memiliki atribut (warna, merek, kecepatan) dan metode (menjalankan, berhenti, belok).
| Konsep | Penjelasan |
|---|---|
| Class | Cetak biru (blueprint) atau template untuk membuat objek. |
| Object | Instansiasi dari kelas, yaitu "benda nyata" yang dibuat dari cetak biru tersebut. |
Contoh:
class Mobil:
pass
# membuat objek
avanza = Mobil()
print(type(avanza)) # <class '__main__.Mobil'>
Sebuah kelas dibuat dengan kata kunci class, dan objek dibuat dengan memanggil kelas seperti fungsi.
class Mobil:
def __init__(self, merek, warna):
self.merek = merek
self.warna = warna
# Membuat objek
mobil1 = Mobil("Toyota", "Merah")
mobil2 = Mobil("Honda", "Hitam")
print(mobil1.merek) # Toyota
print(mobil2.warna) # Hitam
__init__() disebut constructor, otomatis dipanggil ketika objek dibuat.self selalu merujuk ke objek itu sendiri.Atribut adalah variabel yang melekat pada objek. Cek kode berikut ini:
class Mahasiswa:
def __init__(self, nama, nim):
self.nama = nama
self.nim = nim
Adalah fungsi yang menjadi perilaku objek. Cek kode berikut ini:
class Mahasiswa:
def __init__(self, nama, nim):
self.nama = nama
self.nim = nim
def perkenalan(self):
print(f"Halo, saya {self.nama} dengan NIM {self.nim}")
m1 = Mahasiswa("Zaenudin", "2310001")
m1.perkenalan()
__init__) dan SelfKonstruktor __init__ digunakan untuk inisialisasi awal atribut, sedangkan self wajib ditulis di parameter pertama setiap metode dalam kelas.
class PersegiPanjang:
def __init__(self, panjang, lebar):
self.panjang = panjang
self.lebar = lebar
def luas(self):
return self.panjang * self.lebar
pp = PersegiPanjang(5, 3)
print("Luas =", pp.luas())
Konstruktor
selfmembuat tiap objek mempunyai data sendiri-sendiri.
Enkapsulasi adalah menyembunyikan detail internal objek agar tidak bisa diakses langsung dari luar.
class Rekening:
def __init__(self, pemilik, saldo):
self.pemilik = pemilik
self.__saldo = saldo # atribut privat
def lihat_saldo(self):
print(f"Saldo {self.pemilik}: Rp{self.__saldo:,}")
def setor(self, jumlah):
self.__saldo += jumlah
def tarik(self, jumlah):
if jumlah <= self.__saldo:
self.__saldo -= jumlah
else:
print("Saldo tidak cukup!")
r1 = Rekening("Andi", 100000)
r1.setor(50000)
r1.lihat_saldo()
# print(r1.__saldo) ❌ tidak bisa, atribut privat
📘 Atribut yang diawali __ (dua garis bawah/underscore) dianggap private.
Pewarisan atau inheritance memungkinkan kelas baru mewarisi atribut & metode dari kelas lain. Cek kode berikut, di mana kelas Kendaraan digunakan kembali dan memberikan pewarisan terhadap kelas Mobil.
class Kendaraan:
def __init__(self, nama, roda):
self.nama = nama
self.roda = roda
def info(self):
print(f"{self.nama} memiliki {self.roda} roda")
class Mobil(Kendaraan): # mewarisi Kendaraan
def __init__(self, nama, roda, bahan_bakar):
super().__init__(nama, roda) # panggil constructor induk
self.bahan_bakar = bahan_bakar
def info(self):
super().info()
print(f"Bahan bakar: {self.bahan_bakar}")
m = Mobil("Avanza", 4, "Bensin")
m.info()
Polimorfisme berarti “banyak bentuk”. Metode yang sama dapat berperilaku berbeda tergantung objeknya. Cek kode berikut ini:
class Burung:
def bersuara(self):
print("Cuit...")
class Ayam(Burung):
def bersuara(self):
print("Kukuruyuk!")
class Bebek(Burung):
def bersuara(self):
print("Kwek kwek!")
for hewan in [Ayam(), Bebek(), Burung()]:
hewan.bersuara()
Output:
Kukuruyuk! Kwek kwek! Cuit...
super()Kelas turunan dapat mengganti metode dari induknya. Kode super() digunakan untuk memanggil versi induk agar tidak hilang.
class Pegawai:
def gaji(self):
return 5000000
class Manajer(Pegawai):
def gaji(self):
return super().gaji() + 3000000
m = Manajer()
print("Gaji:", m.gaji()) # 8.000.000
Selain pewarisan, kita dapat membangun kelas dari gabungan objek-objek lain. Misalnya:
class Mesin:
def __init__(self, tenaga):
self.tenaga = tenaga
class Mobil:
def __init__(self, merek, mesin):
self.merek = merek
self.mesin = mesin
mesin1 = Mesin("120 HP")
mobil1 = Mobil("Honda", mesin1)
print(f"{mobil1.merek} dengan mesin {mobil1.mesin.tenaga}")
Komposisi membuat sistem modular dan fleksibel.
MahasiswaAktif.property untuk kontrol akses aman.abc (Abstract Base Class) untuk mendefinisikan antarmuka umum.dataclasses untuk kelas data murni, misalnya:from dataclasses import dataclass
@dataclass
class Titik:
x: float
y: float
t = Titik(2.5, 4.1)
print(t.x, t.y)
| Konsep | Penjelasan Singkat | Contoh |
|---|---|---|
| Class | Cetak biru (blueprint) objek | class Mobil: |
| Object | Instance dari class |
m = Mobil() |
| Atribut | Data milik objek | self.warna |
| Metode | Fungsi milik objek | def jalan(self): |
| Constructor | Inisialisasi otomatis | __init__() |
| Encapsulation | Menyembunyikan data | __saldo |
| Inheritance | Pewarisan | class Anak(Induk): |
| Polymorphism | Metode berbeda, nama sama | obj.metode() |
| Composition | Gabungan objek lain | Mobil(mesin=Mesin()) |
Referensi