Kelas menghimpun data dan perilaku yang saling berhubungan ke dalam satu definisi, dan instans (instance) adalah objek konkret yang dibuat dari definisi tersebut. Semua nilai pada Python pada dasarnya adalah objek yang dibuat dari kelas, termasuk string, list, dan fungsi. Topik ini membahas pernyataan class, peran metode __init__, makna parameter self, serta pembuatan instans dan pemanggilan metodenya.
Mendefinisikan kelas dan membuat instans#
Definisi kelas dimulai dengan kata kunci class, diikuti nama kelas dan titik dua. Badan kelas berisi metode, yaitu fungsi yang didefinisikan di dalam kelas. Instans baru dibuat dengan menuliskan nama kelas diikuti tanda kurung, sehingga bentuknya mirip pemanggilan fungsi. Nama kelas mengikuti konvensi CapWords, yaitu setiap kata diawali huruf kapital tanpa pemisah, sedangkan nama metode dan atribut ditulis dengan huruf kecil dan garis bawah.
class Rekening:
def __init__(self, pemilik, saldo):
self.pemilik = pemilik
self.saldo = saldo
def tampilkan(self):
print(self.pemilik, "memiliki saldo", self.saldo)
a = Rekening("Ali", 120000)
b = Rekening("Citra", 75000)
a.tampilkan()
b.tampilkan()
print(type(a).__name__)Ali memiliki saldo 120000
Citra memiliki saldo 75000
RekeningPemanggilan Rekening("Ali", 120000) membuat objek baru, lalu Python memanggil __init__ dengan objek baru itu sebagai argumen pertama dan "Ali", 120000 sebagai argumen berikutnya. Baris self.pemilik = pemilik menugaskan atribut instans bernama pemilik pada objek yang sedang dibuat. Kedua instans memegang nilai saldo yang berbeda meskipun definisi kelasnya sama. Ekspresi type(a).__name__ menampilkan Rekening, yang menegaskan bahwa a berupa instans kelas tersebut.
Badan kelas dijalankan sekali saat definisi kelas dibaca, dan hasilnya berupa objek kelas yang menyimpan metode-metodenya. Kelas pun berupa objek, sehingga dapat ditugaskan pada variabel, dikirim sebagai argumen, dan diperiksa tipenya. Metode yang tercantum di badan kelas pada dasarnya adalah atribut milik objek kelas tersebut, dan itulah sebabnya Sapa.sapa dapat dipanggil melalui nama kelas pada contoh bagian berikutnya.
Diagram berikut menampilkan hubungan satu kelas dengan instans yang dibuat darinya. Kelas menyimpan definisi atribut dan metode, sedangkan setiap instans menyimpan nilainya sendiri.
Peran parameter self#
Parameter self adalah instans pemanggil metode. Python mengisinya secara otomatis pada pemanggilan melalui objek, sehingga a.tampilkan() dijalankan tanpa menyebut a di dalam kurung. Nama self hanyalah konvensi penamaan yang direkomendasikan PEP 8, tetapi konvensi ini diikuti hampir seluruh kode Python sehingga sebaiknya tetap digunakan. Posisi self selalu menjadi parameter pertama pada metode instans, dan parameter lain menyusul setelahnya.
class Sapa:
def __init__(self, nama):
self.nama = nama
def sapa(self):
return "Halo, " + self.nama
s = Sapa("Budi")
print(s.sapa())
print(Sapa.sapa(s))Halo, Budi
Halo, BudiKedua baris terakhir menghasilkan keluaran yang sama. Pemanggilan s.sapa() diterjemahkan Python menjadi Sapa.sapa(s), yaitu metode pada kelas dipanggil dengan instans sebagai argumen pertama. Di dalam badan metode, self.nama membaca atribut milik instans pemanggil, sehingga instans lain yang memanggil metode yang sama membaca nilai miliknya sendiri. Pemahaman ini membantu saat membaca pesan error yang menyebut jumlah argumen sebuah metode.
Program utuh: kelas Tabungan#
Kelas berikut memadukan __init__ dengan nilai default, metode yang mengubah atribut, dan nilai kembalian yang melaporkan keberhasilan. Parameter saldo_awal=0 bersifat opsional, sehingga instans dapat dibuat tanpa menyebut saldo awal. Metode tarik() mengembalikan False apabila saldonya tidak mencukupi, sehingga pemanggil dapat mengambil keputusan tanpa jalur penanganan exception tambahan.
class Tabungan:
def __init__(self, pemilik, saldo_awal=0):
self.pemilik = pemilik
self.saldo = saldo_awal
def setor(self, jumlah):
self.saldo += jumlah
def tarik(self, jumlah):
if jumlah > self.saldo:
return False
self.saldo -= jumlah
return True
t = Tabungan("Dewi", 50000)
t.setor(20000)
t.tarik(10000)
print(t.pemilik, "memiliki saldo", t.saldo)
gagal = t.tarik(90000)
print("penarikan gagal:", gagal, "saldo tetap", t.saldo)Dewi memiliki saldo 60000
penarikan gagal: False saldo tetap 60000Simpan berkas di atas di direktori kerja, lalu jalankan dengan perintah berikut.
# menjalankan program kelas Tabungan
python3 tabungan.pyDewi memiliki saldo 60000
penarikan gagal: False saldo tetap 60000Metode setor() dan tarik() menulis pada atribut self.saldo, sehingga perubahan hanya menyentuh instans t. Saldo bergerak dari 50000 menjadi 70000 setelah setor, lalu 60000 setelah tarik. Penarikan terakhir sebesar 90000 melebihi saldo, sehingga tarik() mengembalikan False tanpa mengubah nilai saldo. Nilai default pada parameter juga membuat __init__ tetap fleksibel, karena Tabungan("Ali") langsung menghasilkan instans dengan saldo 0 tanpa baris tambahan.
Pola mengembalikan True dan False pada metode yang berpotensi gagal merupakan salah satu desain yang sering dipakai. Alternatifnya adalah menimbulkan exception, dan pilihan di antara keduanya ditentukan oleh seberapa sering kegagalan itu terjadi dalam alur normal program. Apabila saldo tidak mencukupi untuk penarikan, kegagalan merupakan keadaan yang wajar, sehingga nilai kembalian boolean lebih ringkas daripada penanganan exception di setiap pemanggil.
Kesalahan umum#
Kesalahan pertama adalah mendefinisikan metode tanpa parameter self, sehingga pemanggilan melalui instans dianggap memberikan argumen berlebih.
class Antrian:
def ukuran():
return 0
a = Antrian()
try:
a.ukuran()
except TypeError as e:
print(type(e).__name__, str(e))TypeError Antrian.ukuran() takes 0 positional arguments but 1 was givenInterpreter menghitung a sebagai argumen pertama, sedangkan ukuran() tidak menampung parameter apa pun, sehingga pesannya menyebut satu argumen diberikan tanpa parameter yang menampungnya. Perbaikannya adalah menambahkan self sebagai parameter pertama metode tersebut.
Kesalahan kedua adalah membaca atribut yang belum pernah ditugaskan pada instans tersebut.
class Peserta:
def __init__(self, nama):
self.nama = nama
p = Peserta("Dewi")
try:
print(p.nilai)
except AttributeError as e:
print(type(e).__name__, str(e))AttributeError 'Peserta' object has no attribute 'nilai'Atribut instans hanya ada setelah __init__ atau metode lain menugaskannya. Apabila sebuah atribut wajib tersedia pada setiap objek, pastikan penugasannya berada di dalam __init__, sehingga setiap instans membawa nilai awalnya sejak dibuat.
Kesalahan ketiga adalah lupa tanda kurung pemanggilan. Ekspresi hasil = a.tampilkan tanpa kurung menugaskan objek metode, bukan hasil pemanggilannya, dan cetakannya memuat alamat memori yang berubah-ubah. Tanda paling mudah dikenali adalah kata bound method pada keluaran yang tidak semestinya, dan perbaikannya cukup menambahkan tanda kurung pemanggilan.
Ringkasan#
- Pernyataan
classmendefinisikan kelas, dan pemanggilan nama kelas diikuti tanda kurung membuat instans baru. - Metode
__init__dijalankan otomatis saat instans dibuat dan bertugas mengisi nilai awal atribut melaluiself. - Parameter
selfmerujuk instans pemanggil dan diisi Python secara otomatis pada pemanggilan melalui objek. - Atribut instans tersimpan per objek, sehingga dua instans dari kelas yang sama dapat memegang nilai yang berbeda.
Referensi#
- A First Look at Classes — Python Software Foundation — Bagian tutorial resmi tentang definisi kelas, pembuatan instans, dan metode.
- Basic customization — Python Software Foundation
— Referensi bahasa untuk
__init__dan proses pembuatan objek.