‹ Daftar slidePertemuan 13: Implementasi OOP dalam Python: Inheritance dan Polymorphism
Program Studi Bisnis Digital • FEB UNDIP
Implementasi OOP dalam Python
Pertemuan 13 — Inheritance dan Polymorphism
Membangun kelas baru dari kelas yang sudah ada, lalu membuat satu method bekerja berbeda-beda tergantung objek yang memanggilnya.
RPS MINGGU 14 • 2X50 MENIT
Tujuan Pembelajaran Hari Ini
Setelah pertemuan ini, Anda diharapkan mampu merancang hierarki kelas dan memanfaatkan polymorphism dalam program Python. Secara rinci:
CAPAIAN 1 — INHERITANCE
PEWARISAN KELAS
Mendefinisikan subclass yang mewarisi atribut & method superclass memakai sintaks class Anak(Induk): dan super().
CAPAIAN 2 — OVERRIDING
MENIMPA METHOD INDUK
Menulis ulang method warisan di subclass agar perilakunya sesuai kebutuhan khusus kelas anak.
CAPAIAN 3 — POLYMORPHISM
SATU METHOD, BANYAK BENTUK
Memanggil method dengan nama sama pada objek kelas berbeda dan mendapat hasil yang berbeda pula.
CAPAIAN 4 — STUDI KASUS
SISTEM TOKO ONLINE
Merancang hierarki kelas produk & pengiriman sederhana untuk kasus bisnis digital Indonesia.
Recap Pertemuan 12: Class, Object, Encapsulation
Minggu lalu Anda sudah membuat class pertama Anda. Mari kita segarkan ingatan sebelum melangkah lebih jauh.
class Produk:
def __init__(self, nama, harga):
self.nama = nama
self._harga = harga # atribut privat
def info(self):
return f"{self.nama} - Rp{self._harga}"
ISTILAH KUNCI YANG SUDAH DIKUASAI
Class — cetak biru/blueprint untuk membuat object
Object — instans nyata hasil dari Produk("Kaos", 80000)
Encapsulation — menyembunyikan atribut (tanda garis bawah _harga) di balik method
self — rujukan ke object itu sendiri di dalam class
Bagian 1 dari 3
Inheritance — Mewariskan Sifat Antar-Kelas
Bagaimana kelas baru bisa "mewarisi" seluruh atribut dan method dari kelas yang sudah ada, lalu menambah atau mengubah sebagian saja.
Superclass & Subclasssuper()Overriding
Apa Itu Inheritance?
Inheritance atau pewarisan (glos: teknik OOP membentuk kelas baru dari kelas yang sudah ada, mewarisi seluruh atribut & method-nya) memungkinkan Anda membangun subclass (kelas anak) dari superclass (kelas induk) tanpa menulis ulang kode.
ANALOGI BISNIS
Semua Manajer adalah Karyawan — mereka punya nama dan gaji pokok (warisan dari Karyawan), tetapi Manajer punya tambahan: tunjangan jabatan dan tim yang dipimpin.
MENGAPA INHERITANCE PENTING
Reuse kode — tidak menulis ulang atribut/method yang sama
Hierarki logis — mencerminkan hubungan "adalah jenis dari" (is-a)
Mudah dipelihara — perbaikan di induk otomatis berlaku ke semua anak
Sintaks Inheritance di Python
Tulis nama superclass di dalam tanda kurung setelah nama subclass, lalu panggil super().__init__() untuk mewarisi constructor.
class Produk:
def __init__(self, nama, harga):
self.nama = nama
self.harga = harga
class ProdukDigital(Produk): # subclass mewarisi Produk
def __init__(self, nama, harga, link_unduh):
super().__init__(nama, harga) # panggil constructor induk
self.link_unduh = link_unduh
class ProdukDigital(Produk): — tanda kurung berisi Produk menandakan pewarisan. super().__init__() (glos: memanggil constructor kelas induk agar atribut induk ikut terisi) menghindari penulisan ulang self.nama dan self.harga.
Diagram: Hierarki Kelas Produk Toko Online
SUPERCLASS & DUA SUBCLASS
Method Overriding: Menimpa Perilaku Induk
Overriding (glos: subclass mendefinisikan ulang method dengan nama sama dari superclass untuk mengganti perilakunya) terjadi ketika subclass menulis method dengan nama identik dengan method di superclass.
class Produk:
def info(self):
return f"{self.nama} - Rp{self.harga}"
class ProdukDigital(Produk):
def info(self): # nama sama dengan info() di Produk
return f"{self.nama} (unduh: {self.link_unduh})"
Python memilih method dari kelas paling spesifik yang dimiliki object tersebut. Object ProdukDigital akan memanggil info() versi ProdukDigital, bukan versi Produk — meski method-nya diwariskan dari Produk.
Hitung dari Nol: Harga Akhir ProdukDiskon (Override)
ProdukDiskon(Produk) meng-override hitung_harga_akhir() untuk menambah diskon member 15% sebelum PPN, pada produk seharga Rp150.000.
Langkah
Perhitungan
Nilai
1. Harga dasar (dari Produk)
diberikan
Rp150.000
2. Diskon member 15%
150.000 × 15%
Rp22.500
3. Harga setelah diskon
150.000 − 22.500
Rp127.500
4. PPN efektif 11% (PMK 131/2024)
127.500 × 11%
Rp14.025
5. Harga akhir dibayar pembeli
127.500 + 14.025
Rp141.525
HASIL
Rp141.525
Sekilas: Multiple Inheritance dan MRO
Python mendukung multiple inheritance — satu subclass mewarisi lebih dari satu superclass sekaligus: class C(A, B):.
LANGKAH 1 — PEMANGGILAN METHOD
Saat objek_c.info() dipanggil, Python cari dulu method info() di kelas C sendiri.
LANGKAH 2 — TELUSURI MRO
Kalau tidak ditemukan di C, Python telusuri MRO (glos: Method Resolution Order, urutan pencarian method) — ke A dulu, baru B, sesuai urutan di class C(A, B):.
Untuk pemula: hindari multiple inheritance kecuali benar-benar perlu — kompleksitasnya (dikenal sebagai diamond problem) mudah membingungkan. Inheritance tunggal sudah cukup untuk hampir semua kasus bisnis digital.
Bagian 2 dari 3
Polymorphism — Satu Antarmuka, Banyak Bentuk
Bagaimana method dengan nama sama bisa menghasilkan perilaku berbeda, tergantung objek kelas apa yang memanggilnya.
Overriding Run-timeDuck Typingisinstance()
Apa Itu Polymorphism?
Polymorphism atau polimorfisme (glos: dari bahasa Yunani "banyak bentuk" — kemampuan objek dari kelas berbeda merespons pemanggilan method yang sama dengan caranya masing-masing) adalah hasil alami dari method overriding.
ANALOGI BISNIS: METHOD bayar()
PembayaranQRIS.bayar() — pindai kode QR, verifikasi via bank
PembayaranTransfer.bayar() — cek mutasi rekening tujuan
PembayaranCOD.bayar() — kurir menerima uang tunai saat antar
Nama method sama persis (bayar()), tetapi setiap kelas menjalankan langkah yang berbeda. Kode yang memanggil metode_bayar.bayar() tidak perlu tahu — dan tidak perlu peduli — kelas spesifik mana yang sedang dipakai.
Polymorphism dalam Aksi: Loop Objek Campuran
Satu list berisi object dari kelas berbeda, dipanggil dengan method yang sama — Python otomatis memilih versi info() yang tepat untuk tiap object.
daftar_produk = [
Produk("Kabel USB", 25000),
ProdukFisik("Kaos Polos", 80000, berat=0.2),
ProdukDigital("E-book Python", 50000, "drive.google.com/xyz")
]
for p in daftar_produk:
print(p.info()) # method sama, output berbeda per kelas
Baris p.info() ditulis satu kali saja, tetapi menghasilkan tiga output berbeda karena Python memeriksa kelas sebenarnya dari p saat program berjalan (run-time), bukan saat kode ditulis.
Duck Typing di Python
Duck typing (glos: "kalau jalannya seperti bebek dan bersuara seperti bebek, anggap saja itu bebek" — Python tidak peduli tipe kelas asal object punya method yang dibutuhkan) adalah gaya polymorphism khas Python.
def cetak_info(objek):
print(objek.info()) # tidak peduli objek dari kelas apa
cetak_info(Produk("Kabel", 25000)) # jalan
cetak_info(ProdukDigital("E-book", 50000, "link")) # jalan juga
Fungsi cetak_info() menerima object apa pun asal punya method info() — tidak wajib berasal dari class Produk. Ini berbeda dengan bahasa seperti Java/C# yang mewajibkan deklarasi interface eksplisit.
Hitung dari Nol: Total Ongkir Polymorphic (3kg)
Tiga subclass Pengiriman punya biaya_kirim(berat) berbeda-beda. Loop memanggil method yang sama pada tiap object untuk paket 3kg.
Langkah
Perhitungan
Nilai
1. Reguler.biaya_kirim(3)
3kg × Rp5.000/kg
Rp15.000
2. Express.biaya_kirim(3)
3kg × Rp9.000/kg
Rp27.000
3. SameDay.biaya_kirim(3)
Rp25.000 + (3kg × Rp3.000/kg)
Rp34.000
4. Total (loop polymorphic)
15.000 + 27.000 + 34.000
Rp76.000
TOTAL ONGKIR 3 OPSI
Rp76.000
Mengecek Tipe: isinstance() dan issubclass()
Kadang Anda perlu tahu kelas asal sebuah object secara eksplisit sebelum memprosesnya lebih lanjut — bukan menggantikan polymorphism, melainkan pelengkapnya.
produk = ProdukDigital("E-book", 50000, "link")
isinstance(produk, Produk) # True -- objek turunan Produk?
isinstance(produk, ProdukFisik) # False -- bukan turunan ProdukFisik
issubclass(ProdukDigital, Produk) # True -- kelas ProdukDigital anak dari Produk?
Gunakan isinstance() untuk validasi input (misal: pastikan hanya ProdukFisik yang dihitung ongkirnya), dan issubclass() untuk memeriksa hubungan antar-kelas itu sendiri, bukan object.
Bagian 3 dari 3
Studi Kasus Terintegrasi — Sistem Toko Online Sederhana
Menggabungkan inheritance dan polymorphism untuk merancang sistem katalog & checkout ala UMKM digital.
Hierarki KelasCheckout PolymorphicKesalahan Umum
Studi Kasus: Checkout Polymorphic Toko Online UMKM
KENAPA DESAIN INI EFISIEN
Checkout tidak perlu tahu jenis produk apa pun — cukup panggil harga_akhir()
Tambah jenis produk baru (misal ProdukLangganan) tidak mengubah kode checkout sama sekali
Bug perhitungan PPN cukup diperbaiki satu kali di superclass Produk
Latihan: Bangun Hierarki Kelas Kendaraan
Kerjakan secara individu sebelum pertemuan berikutnya (dikumpulkan via portal e-learning, file .py).
SOAL LATIHAN
Buat superclass Kendaraan dengan atribut merek, tarif_per_km, dan method info().
Buat subclass Motor(Kendaraan) dan Mobil(Kendaraan) yang masing-masing meng-overrideinfo() untuk menampilkan kapasitas penumpang berbeda.
Buat list berisi campuran object Motor dan Mobil, lalu tulis loop yang memanggil info() secara polymorphic untuk mencetak seluruh armada.
Hitung total tarif perjalanan 12km untuk seluruh armada tersebut, tampilkan hasilnya per kendaraan dan totalnya.
Bawa hasil kode Anda ke pertemuan berikutnya — kita akan menyambungkannya dengan antarmuka grafis (GUI) sederhana memakai Tkinter.
Kesimpulan & Penutup
Key Takeaway: Inheritance menghindari pengulangan kode lewat hierarki kelas; polymorphism membuat satu baris pemanggilan method bekerja untuk banyak jenis object sekaligus.
RANGKUMAN BAGIAN 1 & 2
Inheritance — class Anak(Induk): + super().__init__()
Overriding — subclass tulis ulang method dengan nama sama
Polymorphism — method sama, hasil berbeda per kelas objek
Duck typing — Python cek method yang tersedia, bukan tipe kelas
RANGKUMAN BAGIAN 3
isinstance() / issubclass() — validasi tipe saat dibutuhkan
Studi kasus toko online — checkout cukup satu loop untuk semua jenis produk
Fondasi ini siap dipakai membangun antarmuka grafis di Pertemuan 14
Preview Pertemuan 14: Pembuatan Antarmuka Grafis (GUI) Sederhana — kita akan membungkus class Kendaraan/Produk hari ini ke dalam jendela Tkinter yang bisa diklik pengguna.