Belajar dengan membaca secara berurutan

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).

Mengangkat kode bersama ke class induk
Person(induk)name / agegreeting()Employee(anak)mewarisi
Atribut dan method bersama ada di class induk (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
Anak mendapat semua yang dimiliki induk
Person (induk)
  • Atribut: name / age
  • Method: greeting() / say_age()
  • __init__(self, name, age)
Employee (anak)
  • Body kosong (hanya pass)
  • Mewarisi atribut dan method induk
  • Employee("Budi", 45) memanggil __init__ induk
Bahkan ketika anak kosong, semua yang dimiliki induk tersedia. Memakai ulang perilaku tanpa menulis ulang adalah inti dari pewarisan.

Bangun induk Person dan Employee yang hanya mewarisi.

① Definisikan class Person: dengan __init__(self, name, age) yang menetapkan self.name dan self.age.

② Di dalam Person, definisikan greeting(self) yang menjalankan print(f"Halo, {self.name}").

③ Tulis class Employee(Person): dengan body hanya pass.

④ Bangun e = Employee("Budi", 45) dan panggil e.greeting().

(Begitu berjalan benar, penjelasan akan muncul.)

Python Editor

Jalankan kode untuk melihat output

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
Urutan pencarian method
e.greeting()greeting diEmployee?ada→ jalankangreeting diPerson?jalan jika ada,lainnya error① cariYajika Tidak
Python mencari method di class anak terlebih dahulu. Jika tidak ada, naik ke induk. Nama sama → anak menang — itulah override.

Tambahkan override greeting ke kode sebelumnya.

① Bangun class Person yang sama seperti sebelumnya (__init__ dan greeting).

② Definisikan class Employee(Person): dan di dalamnya definisikan ulang greeting(self) untuk menjalankan print(f"Halo, karyawan {self.name}").

③ Bangun Person("Siti", 30) dan Employee("Budi", 45), lalu panggil greeting() masing-masing dan bandingkan.

Python Editor

Jalankan kode untuk melihat output

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
super().greeting() memakai ulang logika induk
Employee.greeting()body greetinganaksuper().greeting()menjalankangreeting induksisabody anakdipanggiljalan
Di dalam 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.

__init__ anak membangun atribut induk dan anak
Employee("Budi", 45, "555-1111")__init__ anakberjalansuper().__init__(name, age)induk menetapkanname / ageself.phone_number= phone_numberatribut induk + anaksiapdipanggil
Memanggil 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.

Tambahkan phone_number ke Employee dengan override __init__.

① Definisikan class Person: dengan __init__(self, name, age) yang menetapkan self.name dan self.age.

② Definisikan class Employee(Person): dengan __init__(self, name, age, phone_number). Di dalamnya, panggil super().__init__(name, age) dulu, lalu self.phone_number = phone_number.

③ Di dalam Employee, definisikan show(self) yang menjalankan print(f"{self.name} / {self.age} / {self.phone_number}").

④ Bangun Employee("Budi", 45, "555-1111") dan panggil show().

Python Editor

Jalankan kode untuk melihat output
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Mana cara yang benar agar Dog mewarisi dari Animal?

Soal 2Mana deskripsi paling akurat tentang method override?

Soal 3Jika kamu lupa memanggil super().__init__(...) di __init__ anak, apa yang terjadi?