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)) # FalseAssignment
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