stdsquare²
🎓 Kelas
stdsquare / materi / slides / pertemuan-13
Tema
Japan
Arcade
Dark Retro
Font
‹ Daftar slide Pertemuan 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 & Subclass super() 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
Produk (superclass)nama, hargainfo()ProdukFisik (subclass)+ berat, ongkirinfo() — overridecontoh: kaos, buku cetakProdukDigital (subclass)+ link_unduhinfo() — overridecontoh: e-book, template

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.

LangkahPerhitunganNilai
1. Harga dasar (dari Produk)diberikanRp150.000
2. Diskon member 15%150.000 × 15%Rp22.500
3. Harga setelah diskon150.000 − 22.500Rp127.500
4. PPN efektif 11% (PMK 131/2024)127.500 × 11%Rp14.025
5. Harga akhir dibayar pembeli127.500 + 14.025Rp141.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-time Duck Typing isinstance()

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.

LangkahPerhitunganNilai
1. Reguler.biaya_kirim(3)3kg × Rp5.000/kgRp15.000
2. Express.biaya_kirim(3)3kg × Rp9.000/kgRp27.000
3. SameDay.biaya_kirim(3)Rp25.000 + (3kg × Rp3.000/kg)Rp34.000
4. Total (loop polymorphic)15.000 + 27.000 + 34.000Rp76.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 Kelas Checkout Polymorphic Kesalahan Umum

Studi Kasus: Checkout Polymorphic Toko Online UMKM

ProdukProdukFisikProdukDigitalfor p in katalog:total += p.harga_akhir()
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-override info() 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
  • Inheritanceclass 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.