
Encapsulation dan Abstraction di Python
Encapsulation (enkapsulasi) dan abstraction (abstraksi) adalah dua prinsip penting dalam OOP yang membantu menjaga keamanan dan kesederhanaan kode.
Method overriding dan overloading adalah dua teknik penting dalam OOP untuk membuat method lebih fleksibel dan sesuai kebutuhan. Dengan memahami kedua konsep ini, kamu bisa membuat class Python yang lebih powerful, mudah dikembangkan, dan siap digunakan ulang di berbagai situasi. Artikel ini akan membahas secara mendalam tentang method overriding dan overloading, lengkap dengan contoh, studi kasus, best practice, dan tips untuk pemula.
Method overriding adalah proses mendefinisikan ulang method di class anak yang sudah ada di class induk. Dengan overriding, perilaku method bisa disesuaikan di class turunan. Ini sangat berguna saat kamu ingin class turunan punya perilaku berbeda dari class induk, meskipun nama method-nya sama.
Bayangkan kamu punya class Kendaraan
dengan method jalan()
. Semua kendaraan bisa berjalan, tapi cara berjalan mobil dan sepeda motor tentu berbeda. Dengan overriding, kamu bisa membuat method jalan()
di class Mobil
dan Motor
yang perilakunya berbeda dari class Kendaraan
.
class Kendaraan:
def jalan(self):
print("Kendaraan berjalan...")
class Mobil(Kendaraan):
def jalan(self):
print("Mobil melaju di jalan raya.")
class Motor(Kendaraan):
def jalan(self):
print("Motor melaju di jalur motor.")
k = Kendaraan()
m = Mobil()
mt = Motor()
k.jalan()
m.jalan()
mt.jalan()
Kendaraan berjalan...
Mobil melaju di jalan raya.
Motor melaju di jalur motor.
Penjelasan:
jalan
di class Mobil
dan Motor
menimpa (override) method di class Kendaraan
.jalan()
dipanggil dari object Mobil
atau Motor
, Python akan menjalankan method yang ada di class turunan, bukan class induk.Kadang, kamu ingin menambah perilaku method parent, bukan menggantinya total. Gunakan super()
untuk memanggil method parent.
class Hewan:
def suara(self):
print("Hewan bersuara...")
class Kucing(Hewan):
def suara(self):
super().suara()
print("Meong!")
k = Kucing()
k.suara()
Hewan bersuara...
Meong!
Misal kamu punya sistem pembayaran dengan berbagai metode.
class Pembayaran:
def proses(self, jumlah):
print(f"Pembayaran sejumlah {jumlah} diproses.")
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.")
daftar = [TransferBank(), EWallet()]
for metode in daftar:
metode.proses(100000)
Transfer bank sejumlah 100000 diproses.
Pembayaran e-wallet sejumlah 100000 diproses.
Method overloading adalah membuat beberapa method dengan nama sama tapi parameter berbeda. Di banyak bahasa OOP (seperti Java/C++), overloading didukung secara langsung. Namun, Python tidak mendukung method overloading secara eksplisit. Jika kamu mendefinisikan dua method dengan nama sama di satu class, yang terakhir akan menimpa yang sebelumnya.
Python mengakalinya dengan:
*args
dan **kwargs
(parameter fleksibel)class Calculator:
def tambah(self, a, b, c=0):
return a + b + c
calc = Calculator()
print(calc.tambah(2, 3)) # 2 argumen
print(calc.tambah(2, 3, 4)) # 3 argumen
5
9
Penjelasan:
tambah
bisa dipanggil dengan 2 atau 3 parameter berkat default argument.Jika ingin lebih fleksibel, gunakan *args
untuk menerima jumlah argumen tak terbatas.
class Penjumlahan:
def tambah(self, *args):
return sum(args)
p = Penjumlahan()
print(p.tambah(1, 2))
print(p.tambah(1, 2, 3, 4, 5))
3
15
Misal kamu ingin membuat method cetak
yang bisa menerima satu string, list, atau dictionary.
class Printer:
def cetak(self, data):
if isinstance(data, str):
print(f"Teks: {data}")
elif isinstance(data, list):
print("List:", ", ".join(str(x) for x in data))
elif isinstance(data, dict):
print("Dictionary:", ", ".join(f"{k}={v}" for k, v in data.items()))
else:
print("Tipe data tidak dikenali.")
p = Printer()
p.cetak("Hello")
p.cetak([1, 2, 3])
p.cetak({"a": 1, "b": 2})
Teks: Hello
List: 1, 2, 3
Dictionary: a=1, b=2
Overriding | Overloading |
---|---|
Mendefinisikan ulang method parent di class anak | Membuat method dengan nama sama, parameter berbeda |
Didukung langsung di Python | Tidak didukung langsung, pakai default arg/args |
Untuk inheritance (pewarisan) | Untuk fleksibilitas pemanggilan method |
Contoh: Mobil.jalan() |
Contoh: Calculator.tambah(a, b) dan Calculator.tambah(a, b, c) |
No | Tips | Penjelasan |
---|---|---|
1 | Gunakan overriding untuk mengubah perilaku method parent | Pastikan method di class anak sesuai kebutuhan |
2 | Gunakan super() jika ingin menambah, bukan mengganti total |
Agar perilaku parent tetap berjalan |
3 | Untuk overloading, manfaatkan default argumen atau *args |
Agar method fleksibel menerima argumen |
4 | Dokumentasikan parameter method dengan jelas | Agar user tahu cara pakai method |
5 | Jangan buat method terlalu rumit dengan banyak tipe argumen | Bagi jadi beberapa method jika perlu |
super()
padahal butuh perilaku parent.Q: Apakah Python mendukung method overloading seperti Java?
A: Tidak, Python hanya mempertahankan method terakhir dengan nama sama. Gunakan default argumen atau *args
.
Q: Apakah overriding bisa dilakukan di semua method?
A: Ya, semua method parent bisa di-override di class anak.
Q: Bagaimana cara memanggil method parent dari child?
A: Gunakan super().nama_method()
.
Q: Apakah overloading bisa dilakukan di function global?
A: Bisa, dengan default argumen atau *args
.
Q: Apakah overriding dan overloading bisa digabung?
A: Bisa, misal class anak override method parent dan menambah parameter default.
Misal kamu punya sistem notifikasi yang bisa mengirim pesan ke email, SMS, atau WhatsApp.
class Notifikasi:
def kirim(self, pesan):
print(f"Notifikasi: {pesan}")
class Email(Notifikasi):
def kirim(self, pesan, subject=None):
if subject:
print(f"Email: [{subject}] {pesan}")
else:
print(f"Email: {pesan}")
class SMS(Notifikasi):
def kirim(self, pesan):
print(f"SMS: {pesan}")
n = Notifikasi()
e = Email()
s = SMS()
n.kirim("Sistem aktif.")
e.kirim("Ada pesan baru.", subject="Info")
s.kirim("Kode OTP: 123456")
Notifikasi: Sistem aktif.
Email: [Info] Ada pesan baru.
SMS: Kode OTP: 123456
Method overriding dan overloading adalah dua teknik penting dalam OOP Python untuk membuat class lebih fleksibel dan powerful. Overriding memungkinkan class turunan mengubah perilaku method parent, sedangkan overloading (dengan default argumen/args) membuat method lebih fleksibel menerima berbagai parameter.
Teruslah berlatih membuat class dengan overriding dan overloading di berbagai kasus nyata, agar semakin mahir dan siap membangun aplikasi Python yang profesional!
Happy coding!
Encapsulation (enkapsulasi) dan abstraction (abstraksi) adalah dua prinsip penting dalam OOP yang membantu menjaga keamanan dan kesederhanaan kode.
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.