Soal 1Mana cara yang benar agar Dog mewarisi dari Animal?
Pewarisan Class — Memakai Ulang Fitur dari Class yang Sudah Ada
Pelajari pewarisan class di Python. Wariskan atribut dan method dengan class Anak(Induk):, override method, dan panggil versi induk dengan super() — lengkap dengan diagram.
Sebelumnya kita memakai special method seperti __add__ dan __str__ untuk mengajari class bawaan ke class buatan kita. Kali ini kita membahas salah satu ide inti OOP: pewarisan class.
Kenapa pakai pewarisan?
Saat membangun aplikasi, kamu sering bertemu class yang hampir sama tetapi berbeda di beberapa titik. Bayangkan Customer, Employee, dan Admin — semuanya menyimpan name dan email lalu mengembalikan greeting(), tetapi masing-masing punya beberapa atribut atau method tambahan.
Kamu bisa menulis name / email / greeting() yang sama di ketiga class — tetapi kode jadi terduplikasi dan setiap perubahan harus terjadi di tiga tempat. Solusi yang rapi adalah meletakkan bagian bersama di sebuah class induk dan membuat tiap class anak «mewarisi induk dan hanya menulis perbedaannya». Itulah pewarisan (inheritance).
Person). Hanya perbedaannya masuk ke class anak (Employee). Tidak perlu mendeklarasikan name atau greeting berulang.Mewarisi dari induk — class Anak(Induk):
Sintaksnya sederhana: saat mendefinisikan subclass, letakkan class induk dalam tanda kurung setelah nama class. Subclass otomatis mengambil seluruh atribut dan method induk.
Di bawah, Person adalah induk (dengan name, age, dan greeting) dan Employee adalah anak. Employee tidak mendefinisikan satu method pun sendiri, tetapi memanggil greeting() tetap berjalan berkat pewarisan.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greeting(self):
print(f"Halo, {self.name}")
def say_age(self):
print(f"umur {self.age} tahun")
class Employee(Person): # mewarisi Person
pass # body boleh kosong
e = Employee("Budi", 45)
e.greeting() # Halo, Budi <- method induk
e.say_age() # umur 45 tahun
- Atribut: name / age
- Method: greeting() / say_age()
- __init__(self, name, age)
- Body kosong (hanya pass)
- → Mewarisi atribut dan method induk
- Employee("Budi", 45) memanggil __init__ induk
Override method — Mengganti dengan nama yang sama
Pewarisan murni memberikan kamu perilaku induk tanpa perubahan. Tetapi jika kamu menulis method dengan nama yang sama di class anak, versi anak diutamakan. Itulah override.
Misalnya, untuk memberi Employee salam berbeda seperti «Halo, karyawan Budi», definisikan ulang greeting di anak. Memanggilnya pada instance Person memberi salam induk; memanggilnya pada instance Employee memberi salam anak. Perilakunya berganti berdasarkan class instance yang memanggil.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greeting(self):
print(f"Halo, {self.name}")
class Employee(Person):
def greeting(self): # nama sama = override
print(f"Halo, karyawan {self.name}")
p = Person("Siti", 30)
e = Employee("Budi", 45)
p.greeting() # Halo, Siti
e.greeting() # Halo, karyawan Budi <- versi anak menang
super() — Memanggil method induk
Kadang kamu ingin override method tetapi tetap memanfaatkan perilaku induk. Di sinilah super() masuk. Menulis super().method() memanggil method bernama sama pada induk class saat ini.
Misalnya, kamu ingin «greeting induk (mencetak Halo, Budi) diikuti satu baris tambahan di anak». Di dalam greeting anak, panggil super().greeting() dulu, lalu tambahkan barismu sendiri.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greeting(self):
print(f"Halo, {self.name}")
class Employee(Person):
def greeting(self):
super().greeting() # ① jalankan greeting induk dulu
print(f"Saya karyawan {self.name}") # ② lalu baris milik anak
Employee("Budi", 45).greeting()
# Halo, Budi
# Saya karyawan Budi
greeting anak, memanggil super().greeting() menjalankan greeting induk langsung. self diteruskan otomatis — kamu tidak menulisnya.Override __init__ untuk menambah atribut
Tempat super() paling bersinar adalah saat kamu override __init__. Bayangkan class anak butuh atribut induk plus beberapa atribut sendiri — misalnya, Employee juga harus menyimpan phone_number.
Dalam kasus itu kamu definisikan ulang __init__ di anak, tetapi inisialisasi induk (self.name = name dst.) ditangani dalam satu baris oleh super().__init__(name, age), dan kamu tambahkan atribut tambahan sesudahnya. Dengan begitu kamu tidak perlu mengulang penetapan name / age.
Employee(...) menjalankan __init__ anak → super().__init__(name, age) memberi induk menetapkan name / age → lalu anak menambahkan phone_number. Akhirnya: atribut induk + anak lengkap.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Employee(Person):
def __init__(self, name, age, phone_number):
super().__init__(name, age) # ① induk menetapkan name / age
self.phone_number = phone_number # ② tambahkan atribut khusus anak
def show(self):
print(f"{self.name} / {self.age} / {self.phone_number}")
Employee("Budi", 45, "555-1111").show()
# Budi / 45 / 555-1111
Lupa super().__init__(...) dan atribut menghilang
Jika kamu override __init__ tetapi lupa memanggil super().__init__(...), penetapan induk seperti self.name = name tidak pernah terjadi. Saat berikutnya kamu membaca self.name, kamu mendapat AttributeError. Setiap kali override __init__ di class anak, panggil super().__init__(...) di paling awal — jadikan kebiasaan.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Mana deskripsi paling akurat tentang method override?
Soal 3Jika kamu lupa memanggil super().__init__(...) di __init__ anak, apa yang terjadi?