Learn
← Previous Next →

Hari 18: Inheritance & Polymorphism

65 min Last updated 26 Mar 2026

Inheritance (Pewarisan)

Class anak mewarisi atribut dan method dari class induk. Gunakan super() untuk mengakses class induk.

class Hewan:
    def __init__(self, nama, umur):
        self.nama = nama
        self.umur = umur

    def info(self):
        return f"{self.nama} ({self.umur} tahun)"

    def suara(self):
        return "..."

class Anjing(Hewan):
    def __init__(self, nama, umur, ras):
        super().__init__(nama, umur)  # panggil __init__ induk
        self.ras = ras

    def suara(self):           # override method induk
        return "Guk guk!"

    def info(self):
        return f"{super().info()} — Ras: {self.ras}"

class Kucing(Hewan):
    def suara(self):
        return "Meow~"

d = Anjing("Rex", 3, "German Shepherd")
k = Kucing("Mimi", 2)
print(d.info())    # Rex (3 tahun) — Ras: German Shepherd
print(d.suara())   # Guk guk!
print(k.suara())   # Meow~

Polymorphism

Objek berbeda merespons method yang sama dengan cara berbeda.

class Bentuk:
    def luas(self):
        raise NotImplementedError("Subclass harus mengimplementasikan luas()")

    def info(self):
        return f"{self.__class__.__name__}: luas = {self.luas():.2f}"

class Lingkaran(Bentuk):
    def __init__(self, r):
        self.r = r
    def luas(self):
        return 3.14159 * self.r ** 2

class Persegi(Bentuk):
    def __init__(self, s):
        self.s = s
    def luas(self):
        return self.s ** 2

class SegitigaSiku(Bentuk):
    def __init__(self, a, t):
        self.a, self.t = a, t
    def luas(self):
        return 0.5 * self.a * self.t

# Polymorphism: satu interface, banyak implementasi
bentuk_list = [Lingkaran(7), Persegi(5), SegitigaSiku(6, 4)]
for b in bentuk_list:
    print(b.info())  # masing-masing panggil luas() versi sendiri

Multiple Inheritance & MRO

class A:
    def hello(self): return "dari A"

class B(A):
    def hello(self): return "dari B"

class C(A):
    def hello(self): return "dari C"

class D(B, C):   # multiple inheritance
    pass

d = D()
print(d.hello())     # dari B — ikut MRO (Method Resolution Order)
print(D.__mro__)     # urutan pencarian method

isinstance & issubclass

print(isinstance(d, Anjing))   # True
print(isinstance(d, Hewan))    # True — karena Anjing turunan Hewan
print(isinstance(d, Kucing))   # False

print(issubclass(Anjing, Hewan))   # True
print(issubclass(Hewan, Anjing))   # False

Assignment

Buat hierarki class Karyawan → (KaryawanTetap, KaryawanKontrak, Freelancer). Setiap kelas punya cara hitung gaji berbeda. KaryawanTetap: gaji_pokok + tunjangan. KaryawanKontrak: gaji_pokok * durasi_bulan. Freelancer: tarif_per_proyek * jumlah_proyek.

Expected output:

Budi (Engineering): Rp 10,000,000
Ani (Marketing): Rp 30,000,000
Citra (Freelance): Rp 6,000,000
Total pengeluaran: Rp 46,000,000
PY main.py
Solution
Output