OOP 2: Inheritance & Polimorfisme
Mewarisi class, override method, super(), dan polimorfisme.
Pewarisan (inheritance)
Class anak dapat mewarisi atribut dan method class induk, lalu menambah atau mengubah sesuai kebutuhan. Hasilnya: kode umum cukup ditulis sekali.
class Hewan:
def __init__(self, nama):
self.nama = nama
def suara(self):
return "..."
def perkenalan(self):
return f"{self.nama} berkata {self.suara()}"
class Kucing(Hewan): # Kucing mewarisi Hewan
def suara(self): # override
return "Meong"
class Anjing(Hewan):
def suara(self):
return "Guk"
print(Kucing("Tom").perkenalan()) # Tom berkata Meong
print(Anjing("Rex").perkenalan()) # Rex berkata Guk
print(Hewan("Umum").perkenalan()) # Umum berkata ...
perkenalan() ditulis sekali di Hewan, tetapi hasilnya mengikuti suara() milik tiap anak.
Polimorfisme
"Satu antarmuka, banyak bentuk": kamu memanggil method yang sama pada objek berbeda tanpa peduli tipe pastinya.
for h in [Kucing("Tom"), Anjing("Rex"), Hewan("X")]:
print(h.suara())
super(): memanggil versi induk
class Kucing(Hewan):
def __init__(self, nama, warna):
super().__init__(nama) # jalankan __init__ induk
self.warna = warna
isinstance dan issubclass
k = Kucing("Tom")
print(isinstance(k, Kucing)) # True
print(isinstance(k, Hewan)) # True (anak adalah juga induk)
print(issubclass(Kucing, Hewan)) # True
Method __str__ untuk tampilan
class Hewan:
def __str__(self):
return f"Hewan({self.nama})"
print(objek) memakai __str__.
Pewarisan jamak dan composition
Python mendukung banyak induk (class C(A, B)), tetapi ini mudah membingungkan. Prinsip "has-a lebih baik dari is-a": seringkali lebih fleksibel menyimpan objek lain sebagai atribut (composition) daripada mewarisi.
class Mobil:
def __init__(self):
self.mesin = Mesin() # Mobil PUNYA Mesin
Class abstrak (sekilas)
Modul abc memungkinkan memaksa anak mengimplementasikan method tertentu:
from abc import ABC, abstractmethod
class Bentuk(ABC):
@abstractmethod
def luas(self): ...
Duck typing
"Jika berjalan seperti bebek dan bersuara seperti bebek, ia bebek." Python tidak memeriksa tipe, hanya apakah objek memiliki method yang dibutuhkan, sehingga class yang tidak berhubungan pun bisa dipakai bergantian.