
Inheritance dan Polymorphism di Python
Inheritance (pewarisan) dan polymorphism (polimorfisme) adalah dua konsep utama dalam OOP yang membuat kode lebih fleksibel dan mudah dikembangkan.
Encapsulation (enkapsulasi) dan abstraction (abstraksi) adalah dua prinsip penting dalam OOP yang membantu menjaga keamanan dan kesederhanaan kode. Dengan memahami kedua konsep ini, kamu bisa membuat program Python yang lebih aman, modular, dan mudah dikembangkan. Artikel ini akan membahas secara mendalam tentang encapsulation dan abstraction, lengkap dengan contoh, studi kasus, best practice, dan tips untuk pemula.
Encapsulation adalah proses membungkus data (atribut) dan method dalam satu unit (class), serta membatasi akses langsung ke data tersebut. Tujuannya agar data tidak sembarangan diubah dari luar class. Dengan encapsulation, kamu bisa mengontrol bagaimana data diakses dan diubah, sehingga mencegah bug dan menjaga integritas data.
Bayangkan class seperti brankas di bank. Data penting (uang) disimpan di dalam brankas, dan hanya bisa diakses lewat prosedur tertentu (method). Tidak semua orang bisa langsung mengambil uang dari brankas, harus lewat teller atau prosedur resmi.
__
atau _
).class RekeningBank:
def __init__(self, nama, saldo):
self.nama = nama
self.__saldo = saldo # atribut private
def lihat_saldo(self):
print(f"Saldo {self.nama}: {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 = RekeningBank("Budi", 1000)
r1.lihat_saldo()
r1.setor(500)
r1.lihat_saldo()
r1.tarik(2000)
Saldo Budi: 1000
Saldo Budi: 1500
Saldo tidak cukup!
Penjelasan:
__saldo
tidak bisa diakses langsung dari luar class (private).Jika mencoba mengakses r1.__saldo
langsung, akan error:
print(r1.__saldo) # AttributeError
Namun, Python masih memungkinkan akses dengan “name mangling”:
print(r1._RekeningBank__saldo) # Tidak disarankan!
Tips:
Selalu gunakan method getter/setter untuk akses data private, jangan akses langsung walau bisa.
Python menyediakan property untuk membuat getter/setter dengan cara yang lebih “pythonic”.
class Mahasiswa:
def __init__(self, nama, nilai):
self.nama = nama
self._nilai = nilai
@property
def nilai(self):
return self._nilai
@nilai.setter
def nilai(self, value):
if 0 <= value <= 100:
self._nilai = value
else:
print("Nilai harus 0-100")
m = Mahasiswa("Ani", 80)
print(m.nilai)
m.nilai = 110
print(m.nilai)
80
Nilai harus 0-100
80
Misal kamu ingin membuat sistem login sederhana.
class User:
def __init__(self, username, password):
self.username = username
self.__password = password
def cek_password(self, password):
return self.__password == password
u = User("budi", "rahasia123")
print(u.cek_password("rahasia123")) # True
print(u.cek_password("salah")) # False
True
False
Penjelasan:
Abstraction adalah proses menyembunyikan detail implementasi dan hanya menampilkan fitur penting ke pengguna class. Dengan abstraction, pengguna class tidak perlu tahu bagaimana fitur bekerja di dalam, cukup tahu cara memakainya.
Bayangkan kamu menggunakan remote TV. Kamu cukup menekan tombol “power” untuk menyalakan TV, tanpa perlu tahu rangkaian elektronik di dalamnya. Detail implementasi disembunyikan, hanya fitur penting yang ditampilkan.
abc
).from abc import ABC, abstractmethod
class Bentuk(ABC):
@abstractmethod
def luas(self):
pass
class Persegi(Bentuk):
def __init__(self, sisi):
self.sisi = sisi
def luas(self):
return self.sisi * self.sisi
p = Persegi(4)
print(p.luas())
16
Penjelasan:
Bentuk
adalah abstract class (tidak bisa diinstansiasi langsung).luas
wajib diimplementasikan di class turunan.Misal kamu ingin membuat sistem pembayaran dengan berbagai metode.
from abc import ABC, abstractmethod
class Pembayaran(ABC):
@abstractmethod
def proses(self, jumlah):
pass
class TransferBank(Pembayaran):
def proses(self, jumlah):
print(f"Transfer bank sejumlah {jumlah} diproses.")
class EWallet(Pembayaran):
def proses(self, jumlah):
print(f"Pembayaran e-wallet sejumlah {jumlah} diproses.")
def bayar(pembayaran, jumlah):
pembayaran.proses(jumlah)
b1 = TransferBank()
b2 = EWallet()
bayar(b1, 100000)
bayar(b2, 50000)
Transfer bank sejumlah 100000 diproses.
Pembayaran e-wallet sejumlah 50000 diproses.
Penjelasan:
bayar
bisa menerima object dari class turunan manapun, selama mengimplementasikan method proses
.No | Tips | Penjelasan |
---|---|---|
1 | Gunakan atribut private untuk data penting | Awali nama atribut dengan __ atau _ |
2 | Sediakan method getter/setter jika perlu | Jangan biarkan data diubah sembarangan |
3 | Gunakan property untuk akses data yang butuh validasi | Lebih “pythonic” dan mudah digunakan |
4 | Gunakan abstract class untuk interface umum | Cocok untuk framework, plugin, dsb |
5 | Dokumentasikan class dan method | Agar mudah dipahami tim lain |
6 | Jangan buat class terlalu rumit | Bagi class jika fungsinya sudah terlalu banyak |
Q: Apa beda atribut private dan protected di Python?
A: Private (__nama
) tidak bisa diakses langsung dari luar class, protected (_nama
) hanya konvensi (masih bisa diakses, tapi sebaiknya tidak).
Q: Apakah abstraction hanya untuk class besar?
A: Tidak, abstraction bisa digunakan di class kecil untuk menyederhanakan interface.
Q: Bisakah satu class punya banyak abstract method?
A: Bisa, semua abstract method wajib diimplementasikan di class turunan.
Q: Apakah encapsulation dan abstraction bisa digabung?
A: Sangat bisa, bahkan sering digunakan bersamaan untuk keamanan dan kemudahan penggunaan class.
Misal kamu membuat aplikasi kendaraan dengan berbagai jenis kendaraan.
from abc import ABC, abstractmethod
class Kendaraan(ABC):
def __init__(self, nama):
self._nama = nama # protected
@abstractmethod
def jalan(self):
pass
class Mobil(Kendaraan):
def jalan(self):
print(f"{self._nama} melaju di jalan raya.")
class Sepeda(Kendaraan):
def jalan(self):
print(f"{self._nama} dikayuh di jalur sepeda.")
daftar = [Mobil("Avanza"), Sepeda("Polygon")]
for k in daftar:
k.jalan()
Avanza melaju di jalan raya.
Polygon dikayuh di jalur sepeda.
Encapsulation dan abstraction adalah dua prinsip utama OOP di Python yang membuat kode lebih aman, modular, dan mudah digunakan. Dengan encapsulation, kamu bisa melindungi data penting dari akses sembarangan. Dengan abstraction, kamu bisa menyederhanakan interface dan menyembunyikan detail implementasi yang tidak perlu diketahui pengguna class.
Teruslah berlatih membuat class dengan encapsulation dan abstraction di berbagai kasus nyata, agar semakin mahir dan siap membangun aplikasi Python yang profesional!
Happy coding!
Inheritance (pewarisan) dan polymorphism (polimorfisme) adalah dua konsep utama dalam OOP yang membuat kode lebih fleksibel dan mudah dikembangkan.
Constructor dan destructor adalah dua konsep penting dalam pemrograman berorientasi objek (OOP) di Python.
Class dan object adalah pondasi utama dalam pemrograman berorientasi objek (OOP) di Python.
Menulis kode Python bisa dilakukan di mana saja, bahkan di Notepad sekalipun.