Kursus Python / Membuat class, instance, atribut, dan metode
Class mendefinisikan data dan perilaku yang berkaitan, sedangkan instance adalah objek individual yang dibuat dari definisi itu. Gunakan class ketika keadaan dan aturan pengelolaannya memang perlu disatukan, bukan hanya untuk mengganti setiap fungsi sederhana dengan objek.
Hubungkan class dengan objek individual
Satu class Expense dapat membuat record makan siang dan bus sebagai dua instance. Masing-masing mempunyai nama dan jumlah sendiri, tetapi memakai definisi metode yang sama. Atribut adalah nama yang diakses setelah titik, seperti first.amount; metode adalah fungsi yang digunakan melalui objek, seperti first.describe().
self merupakan nama parameter pertama yang lazim digunakan untuk menerima instance pada metode biasa. Saat memanggil first.describe(), Python menyediakan first sebagai penerima metode. Anda tidak menambahkan self secara manual pada panggilan metode terikat tersebut.
__init__ menyiapkan keadaan objek setelah objek dibuat. Argumen pada Expense("lunch", 8000) dipakai untuk menginisialisasi nama dan jumlah. Penempatan nilai pada self.name serta self.amount membuat keduanya menjadi atribut instance dalam contoh ini. Dasar operasi tersebut dijelaskan pada tutorial class Python.
Jalankan dua instance pengeluaran
Simpan kode lengkap sebagai classes_demo.py dengan encoding UTF-8. Gunakan Python 3.12 atau lebih baru melalui lingkungan proyek, lalu jalankan python classes_demo.py. Tidak diperlukan paket atau berkas data tambahan.
class Expense:
def __init__(self, name, amount):
if amount < 0:
raise ValueError("negative amount")
self.name = name
self.amount = amount
def describe(self):
return f"{self.name}: {self.amount:,} KRW"
first = Expense("lunch", 8000)
second = Expense("bus", 2500)
print(first.describe())
print(second.describe())
print(first.amount + second.amount)
Keluaran yang diharapkan:
lunch: 8,000 KRW
bus: 2,500 KRW
10500
first dan second menunjuk dua objek berbeda. Ketika metode dipanggil melalui first, self.name membaca nama makan siang; ketika dipanggil melalui second, ia membaca nama bus. Penjumlahan terakhir mengakses kedua atribut jumlah dan menghasilkan 10500.
| Nama | Objek | Keadaan awal sesuai program |
|---|---|---|
first |
Instance A | name="lunch", amount=8000 |
second |
Instance B | name="bus", amount=2500 |
Metode mengembalikan string, lalu print menampilkannya. Format :, menambahkan pemisah ribuan dalam tampilan, sedangkan label KRW tidak mengonversi nilai ke mata uang lain. Perbedaan nilai balik dan tampilan tetap mengikuti dasar fungsi dan return.
Batasi tanggung jawab dan pahami batas validasi
Initializer menolak jumlah negatif dengan ValueError, tetapi itu hanya satu aturan. Ia belum secara eksplisit membatasi tipe jumlah menjadi integer biasa. String "8000" gagal ketika dibandingkan dengan nol, sementara nilai boolean atau pecahan dapat melewati pemeriksaan tersebut. Tentukan kontrak tipe dan rentang yang dibutuhkan sebelum memperluas contoh menjadi aplikasi.
Setelah objek dibuat, perintah first.amount = -1 masih dapat mengikat atributnya ke nilai negatif. Pemeriksaan di __init__ tidak otomatis dijalankan pada setiap pemberian nilai berikutnya. Jika aturan harus berlaku pada semua perubahan, rancang antarmuka perubahan yang memvalidasi ulang, misalnya melalui metode atau property yang sesuai.
Jangan memasukkan seluruh pekerjaan menampilkan, menyimpan berkas, dan mengirim jaringan ke Expense hanya karena semuanya menyangkut pengeluaran. Memisahkan aturan record dari penyimpanan eksternal membuat data dapat digunakan oleh pemanggil berbeda dan diuji tanpa sistem luar.
Objek yang berbeda dalam contoh ini mempunyai atribut jumlah sendiri. Namun jika alias = first, kedua nama itu menunjuk objek sama; perubahan melalui alias terlihat melalui first. Class tidak menghapus aturan alias, mutasi, dan penyalinan objek. Jenis atribut dan struktur yang dibagi tetap perlu diperhatikan.
Uji keadaan independen dan pemanggilan metode
- Tambahkan
first.amount = 9000sebelum hasil dicetak. Deskripsi makan siang menjadi 9,000 KRW, deskripsi bus tetap 2,500 KRW, dan jumlah menjadi 11500. - Pulihkan perubahan itu, lalu coba membuat
Expense("lunch", -1)pada percobaan terpisah. Pembuatan gagal denganValueErrorsebelum tiga hasil normal dicetak. - Bandingkan
Expense.describe(first)denganfirst.describe(). Pada metode biasa contoh ini, keduanya memberi string sama karena instance diteruskan sebagai argumen pertama. - Pulihkan sumber asli dan cocokkan kembali tiga baris keluaran serta nilai kedua atribut awal.
Perhatikan ejaan atribut. Pada class sederhana ini, first.amout = 9000 dapat membuat atribut baru yang salah eja dan tidak mengubah first.amount. Tidak semua kesalahan pengetikan langsung menjadi pengecualian.
Ketika record semakin besar, dataclass, anotasi tipe, atau pengujian dapat membantu memperjelas strukturnya. Masing-masing mempunyai fungsi berbeda dan tidak otomatis memvalidasi seluruh aturan. Ukur kegunaan class dari kejelasan keadaan serta tanggung jawabnya, bukan dari banyaknya sintaks atau berkurangnya jumlah baris saja.




