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(...):
- Interpreter membuat object baru yang masih kosong.
- Interpreter memanggil method
__init__milik class, dengan object baru tersebut dioper sebagai argumen pertama. - Setelah
__init__selesai, object yang sudah terisi dikembalikan dan diikat ke nama variabel.
Kita bisa membuktikan tahap kedua dengan menaruh print() di dalam __init__:
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:
__init__ dijalankan untuk: Laskar Pelangi
Laskar PelangiMari kita telaah baris-baris kode di atas:
- 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. - 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__. - Baris 4 (
self.judul = judul): assignment ini memasang attributejudulpada object yang sedang dibuat. - Baris 6 (
buku = Buku("Laskar Pelangi")): satu baris ini menjalankan ketiga tahap mekanisme sekaligus. - 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.
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:
TrueMethod 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:
class Buku:
def __init__():
pass
Buku("Laskar Pelangi")Output yang Dihasilkan:
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 givenPerhatikan 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:
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:
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.