Materi
Dekorator @property mengubah method menjadi atribut yang dibaca tanpa tanda kurung: r.luas, bukan r.luas(). Bentuk ini cocok untuk nilai yang dihitung dari atribut lain, seperti luas dari panjang dan lebar, karena nilainya selalu mengikuti atribut asalnya dan tidak pernah basi. Properti tanpa pasangan setter hanya bisa dibaca.
class Ruang:
def __init__(self, panjang, lebar, sewa_per_m2):
self.panjang = panjang
self.lebar = lebar
self.sewa_per_m2 = sewa_per_m2
@property
def luas(self):
return self.panjang * self.lebar
@property
def sewa_per_m2(self):
return self._sewa
@sewa_per_m2.setter
def sewa_per_m2(self, nilai):
if nilai <= 0:
raise ValueError("sewa harus lebih dari nol")
self._sewa = nilai
r = Ruang(6, 4, 125000)
print(r.luas) # 24
r.lebar = 5
print(r.luas) # 30Pasangan @nama.setter dijalankan setiap kali atribut itu diberi nilai, termasuk dari dalam __init__. Setter dipakai untuk menolak nilai yang tidak masuk akal dengan raise ValueError(...). Nilai aslinya disimpan di atribut lain berawalan garis bawah, misalnya self._sewa; tutorial Python §9.6 menyebut garis bawah sebagai penanda bahwa atribut itu bagian dalam kelas.
Kapan tidak perlu kelas: tutorial Python menyebut kelas sebagai cara menyatukan data dengan fungsinya. Bila tidak ada data yang perlu diingat di antara pemanggilan — misalnya hanya menghitung ongkir dari berat — fungsi biasa sudah cukup, dan kelas berisi __init__ ditambah satu method yang dipanggil sekali hanya menambah baris. Bila datanya hanya disimpan tanpa aturan, dataclass sudah cukup.