Class attribute, @classmethod, @staticmethod
Data dan fungsi milik class, bukan objek individual.
Pahami konsepnya
Class attribute dibagikan semua objek: class Siswa: jumlah = 0 — setiap objek melihat nilai yang sama. Instance attribute (self.nama) milik objek masing-masing. Perbedaan penting: mengubah ClassNama.jumlah mengubah untuk semua; mengubah self.jumlah menciptakan salinan local untuk objek itu.
@classmethod menerima cls (class itu sendiri) alih-alih self — berguna untuk alternative constructor: from_string("Ari,17") membuat objek dari teks. @staticmethod tidak menerima self/cls sama sekali — fungsi biasa yang kebetulan tinggal di class, cocok untuk utilitas.
Urutan pencarian: Python mencari atribut di instance dulu, lalu class, lalu parent class. Karena itu objek bisa menimpa class attribute tanpa mengganggu yang lain.
Coba contoh kode
class Siswa:
jumlah = 0 # class attribute — dibagi semua
def __init__(self, nama):
self.nama = nama
Siswa.jumlah += 1
@classmethod
def dari_string(cls, teks):
nama = teks.split(",")[0]
return cls(nama)
@staticmethod
def valid(nama):
return len(nama) >= 2
ari = Siswa("Ari")
budi = Siswa("Budi")
citra = Siswa.dari_string("Citra,17")
print(Siswa.jumlah) # 3
print(Siswa.valid("A")) # FalseClass attribute jumlah bertambah tiap __init__ berjalan — penghitung objek yang elegan. @classmethod dari_string adalah alternative constructor dari teks. @staticmethod valid tidak butuh self — fungsi utilitas murni.
Latihan singkat
Uji: class counter — 3 objek, cetak Siswa.jumlah, harus `3`.