Pada akhir Chapter Memahami Class dan Object, kita mengisi nama dan umur seekor anjing secara manual satu per satu setelah object dibuat. Cara tersebut punya dua masalah nyata: penulisannya berulang setiap kali object baru dibuat, dan satu attribute yang terlupakan baru ketahuan saat program gagal di tengah jalan. Constructor mengatasi keduanya dengan menjalankan inisialisasi secara otomatis pada saat object dilahirkan. Mulai chapter ini kita juga berganti domain contoh utama Section ke perpustakaan — class Buku akan menemani kita sampai akhir.

init Dijalankan Otomatis Saat Object Dibuat #

Constructor adalah mekanisme yang membangun object baru dalam keadaan siap pakai. Di Python, peran pengisian awal dipegang oleh method bernama __init__. Mekanismenya berlangsung tiga tahap setiap kali kita menulis Buku(...):

  1. Interpreter membuat object baru yang masih kosong.
  2. Interpreter memanggil method __init__ milik class, dengan object baru tersebut dioper sebagai argumen pertama.
  3. Setelah __init__ selesai, object yang sudah terisi dikembalikan dan diikat ke nama variabel.

Kita bisa membuktikan tahap kedua dengan menaruh print() di dalam __init__:

python
class Buku:
    def __init__(self, judul):
        print(f"__init__ dijalankan untuk: {judul}")
        self.judul = judul

buku = Buku("Laskar Pelangi")
print(buku.judul)

Output yang Dihasilkan:

text
__init__ dijalankan untuk: Laskar Pelangi
Laskar Pelangi

Mari kita telaah baris-baris kode di atas:

  1. Baris 2 (def __init__(self, judul):): nama __init__ adalah nama khusus yang dikenali interpreter; Python menyebut nama berawalan dua underscore seperti ini sebagai dunder (double underscore). Kita tidak pernah memanggil __init__ secara manual.
  2. Baris 3 (print(f"__init__ dijalankan untuk: {judul}")): baris ini tercetak sendiri tanpa pernah ada panggilan __init__ di baris lain — bukti bahwa pemanggilan class otomatis menjalankan __init__.
  3. Baris 4 (self.judul = judul): assignment ini memasang attribute judul pada object yang sedang dibuat.
  4. Baris 6 (buku = Buku("Laskar Pelangi")): satu baris ini menjalankan ketiga tahap mekanisme sekaligus.
  5. Baris 7 (print(buku.judul)): attribute sudah terpasang, jadi langsung bisa dibaca.

self adalah Object yang Sedang Dibuat #

self bukan kata kunci bahasa — hanya nama konvensi untuk parameter pertama setiap method. Interpreter-lah yang mengoper object secara otomatis. Bukti paling sederhana: kembalikan self dari sebuah method, lalu bandingkan dengan object aslinya.

python
class Buku:
    def __init__(self, judul):
        self.judul = judul

    def cek_diri(self):
        return self

buku = Buku("Laskar Pelangi")

print(buku.cek_diri() is buku)

Output yang Dihasilkan:

text
True

Method cek_diri() mengembalikan self, dan operator is membandingkan identitas dua object — materi Chapter Memahami Object dan Reference. Hasil True membuktikan self dan buku adalah object yang sama persis, bukan salinan.

Apa yang terjadi jika kita lupa menulis parameter self? Interpreter tetap mengoper object, lalu jumlah argumen jadi tidak cocok:

python
class Buku:
    def __init__():
        pass

Buku("Laskar Pelangi")

Output yang Dihasilkan:

text
Traceback (most recent call last):
  File "02d-error-init-tanpa-self.py", line 5, in <module>
    Buku("Laskar Pelangi")
TypeError: Buku.__init__() takes 0 positional arguments but 2 were given

Perhatikan angka pada pesan galat: kita hanya mengirim satu argument "Laskar Pelangi", tetapi __init__ menerima dua positional arguments. Argument kedua adalah object baru yang dioper interpreter secara diam-diam. Pesan galat ini sekaligus bukti keras bahwa self selalu dikirim otomatis.

Membuat Banyak Instance Sekaligus #

Kekuatan constructor terlihat saat object dibuat berulang kali. Setiap pemanggilan Buku(...) menjalankan __init__ lagi dengan object baru:

python
class Buku:
    def __init__(self, judul, penulis, tahun):
        self.judul = judul
        self.penulis = penulis
        self.tahun = tahun

    def deskripsi(self):
        return f"{self.judul} ({self.penulis}, {self.tahun})"

buku1 = Buku("Laskar Pelangi", "Andrea Hirata", 2005)
buku2 = Buku("Bumi Manusia", "Pramoedya A. Toer", 1980)
buku3 = Buku("Negeri 5 Menara", "A. Fuadi", 2009)

print(buku1.deskripsi())
print(buku2.deskripsi())
print(buku3.deskripsi())

Output yang Dihasilkan:

text
Laskar Pelangi (Andrea Hirata, 2005)
Bumi Manusia (Pramoedya A. Toer, 1980)
Negeri 5 Menara (A. Fuadi, 2009)

Tiga object lahir dari class yang sama dan semuanya terisi lengkap sejak baris pertama pemakaiannya — tidak ada attribute yang tertinggal karena kelupaan. Bentuk data juga menjadi kontrak yang jelas: siapa pun yang membaca __init__ langsung tahu object Buku selalu punya judul, penulis, dan tahun.

Attribute yang dipasang di __init__ disebut instance attribute — data yang dimiliki setiap object secara terpisah. Chapter berikutnya membedah cara penyimpanannya langsung di dalam mesin Python.