Class membungkus data dan apa yang kamu lakukan dengannya
Class memungkinkan kamu mendefinisikan sebuah jenis benda, misalnya pengguna, rekening bank, konfigurasi, atau request, beserta semua hal yang bisa dilakukan benda itu. Benda itu adalah instance dari class. Tindakannya disebut method.
Ini class paling sederhana yang bisa dibuat:
Penjelasannya:
class User:memulai definisi class. Menurut konvensi, nama class memakai PascalCase.__init__adalah initializer. Method ini berjalan otomatis saat kamu membuat instance baru, dan menyiapkan atribut instance itu denganself.whatever = ....greetadalah sebuah method.selfadalah cara method merujuk ke instance tempat method itu dipanggil.User("Rosa", "rosa@example.com")membuat sebuah instance. Python memanggil__init__denganselfdiisi instance baru itu dan argumen lainnya diteruskan.user.greet()memanggil method-nya. Python otomatis mengirimusersebagaiself.
self hanyalah argumen pertama
self bukan kata kunci. Itu nama yang dipakai untuk parameter pertama method instance, yaitu instance tempat method sedang berjalan. Kamu bisa menamainya apa saja; semua orang memakai self karena memang itulah kebiasaannya.
Setiap method instance menerima self sebagai parameter pertamanya. Dengan cara itulah sebuah method tahu instance mana yang harus dibaca atau diubah.
Menambahkan perilaku
Method bisa membaca dan mengubah state:
__repr__ adalah method khusus lain, semacam hook untuk "bagaimana objek ini ditampilkan saat di-print?". Menulis versi yang bagus akan sangat membantu saat debugging.
Atribut class vs atribut instance
Atribut yang didefinisikan di badan class (di luar __init__) dipakai bersama oleh semua instance. Atribut yang di-assign ke self berlaku per instance:
Pakai atribut class untuk nilai yang memang dipakai bersama, seperti konstanta, penghitung, atau konfigurasi. Taruh data yang khusus untuk tiap instance di __init__.
Inheritance
Sebuah class bisa mewarisi class lain, mendapatkan method dan atributnya secara gratis, lalu menambah atau menimpa (override) yang perlu:
super() memberimu akses ke class induk. Biasanya dipakai di dalam __init__ untuk menginisialisasi atribut induk sebelum menambahkan atributmu sendiri:
Inheritance berguna tapi gampang dipakai berlebihan. Programmer Python pemula sering langsung memakai inheritance padahal komposisi, yaitu menyimpan sebuah objek sebagai atribut, akan lebih jelas. Mulailah dengan struktur class yang datar, dan baru pakai inheritance kalau memang ada hubungan "adalah sebuah" (is-a) yang nyata.
Halaman inheritance Python membahas lebih jauh: memperluas method induk dengan super(), isinstance dan issubclass, abstract base class, multiple inheritance, dan method resolution order.
Dataclass: default yang lebih enak untuk data rekaman
Kalau kamu ingin class yang tugas utamanya menyimpan beberapa atribut, dengan perbandingan kesamaan dan tampilan yang wajar, @dataclass menghemat banyak kode berulang (boilerplate):
Bandingkan dengan menulis __init__, __repr__, dan __eq__ sendiri. Dataclass adalah pilihan pertama yang tepat setiap kali kamu sebenarnya akan menulis class Thing yang isinya hanya __init__ untuk mengisi atribut.
Property: atribut yang dihitung
Kadang kamu ingin sebuah "atribut" yang sebenarnya dihitung. @property membuatnya terlihat seperti mengakses atribut:
Pakai property setiap kali kamu akan menulis obj.get_something(): menggantinya dengan property membuat API-nya terasa lebih alami. Jangan memakainya untuk menyembunyikan operasi yang berat, karena pengguna mengira mengakses atribut itu cepat.
Private berdasarkan konvensi
Python tidak punya private yang sungguhan. Menurut konvensi, atribut yang diawali garis bawah dimaksudkan sebagai private: pembaca diharapkan tidak menyentuhnya dari luar class.
class Cache:
def __init__(self):
self._store = {}
def put(self, key, value):
self._store[key] = value
def get(self, key, default=None):
return self._store.get(key, default)
Nama dengan dua garis bawah (__name) memicu name mangling, yang menambahkan nama class ke atribut itu. Itu alat untuk menghindari bentrokan nama dalam inheritance, bukan langkah keamanan.
Kapan tidak perlu memakai class
Kalau yang kamu punya hanya sekumpulan data yang saling terkait, sebuah dataclass, dict biasa, atau named tuple sudah cukup. Kalau yang kamu punya hanya satu fungsi, fungsi itu tidak perlu dibungkus class. Pakai class kalau kamu punya state dan perilaku yang saling terikat, terutama kalau nanti akan ada banyak instance dari jenis yang sama.
Contoh terakhir
Buffer log kecil yang mirip file:
Perhatikan __len__, satu lagi magic method. Mendefinisikannya membuat len(logger) bisa dipakai, karena len(x) sebenarnya adalah pemanggilan x.__len__(). Python punya puluhan hook seperti ini; kamu akan mempelajarinya sesuai kebutuhan.
Pertanyaan yang sering diajukan
Apa itu class di Python?
Class adalah cetak biru untuk membuat objek yang menyatukan data (atribut) dan perilaku (method). class User: mendefinisikan class User, dan User(...) membuat sebuah instance. Class adalah alat utama Python untuk memodelkan sesuatu yang punya state sekaligus perilaku.
Apa arti self di Python?
self adalah parameter pertama setiap method instance. Saat kamu memanggil user.greet(), Python mengirim instance user sebagai self. Di dalam method, self.name mengakses atribut name milik user itu. Nama self hanya konvensi, bukan kata kunci, tapi semua programmer Python memakainya.
Apakah Python berorientasi objek?
Ya. Semua hal di Python adalah objek, termasuk angka, string, dan fungsi. Kamu bisa memakai pemrograman berorientasi objek kalau cocok, tapi Python tidak memaksanya. Banyak program Python di dunia nyata jarang memakai class, dan lebih memilih fungsi biasa serta struktur data sederhana selama bisa.