Method & Property — Python

Method & Property Instance Method Method biasa yang mengakses self: class Circle: def __init__(self, radius): self.radius = radius def area(self): return…

Selain method biasa yang memakai self, class Python punya tiga alat lagi: @property untuk atribut yang dihitung atau dijaga, @staticmethod, dan @classmethod. Bayangin papan harga di Warung Kopi Pak Darto yang dijaga kasir. Siapa pun boleh menulis harga baru di papan, tapi tiap kali ada yang menulis, kasirnya mengecek dulu: harga minus? Ditolak. Pembeli yang membaca papan gak tahu ada kasir di baliknya. Itulah property: dari luar kelihatan seperti atribut biasa, tapi ada method yang jalan di belakangnya.

🧪 Tebakan cepat: class Menu punya setter harga yang menolak angka negatif, dan __init__-nya menulis self.harga = harga. Apa yang terjadi pada Menu("es kopi", -3000): object-nya tetap jadi dengan harga -3000, atau program berhenti dengan error? Tebak dulu, jawabannya ada di bagian "Setter yang menjaga nilai".

Decorator dan empat jenis method

Decorator adalah baris @nama tepat di atas def. Dia mengubah cara method itu dipakai, tanpa mengubah isinya:

Jenis Cara menulis Parameter pertama Cara memanggil
Method biasa (instance method) def total(self, jumlah): self, object-nya kopi.total(3)
Property @property di atas def self kopi.label, tanpa kurung
Class method @classmethod di atas def cls, class-nya Menu.dari_teks("roti bakar,12000")
Static method @staticmethod di atas def gak ada Menu.diskon(89000)

@property: atribut yang dihitung

class Menu:
    def __init__(self, nama, harga):
        self.nama = nama
        self.harga = harga

    @property
    def label(self):
        return f"{self.nama} ({self.harga})"

kopi = Menu("kopi susu", 15000)
print(kopi.label)     # kopi susu (15000)
kopi.harga = 17000
print(kopi.label)     # kopi susu (17000)

Setter yang menjaga nilai

class Menu:
    def __init__(self, nama, harga):
        self.nama = nama
        self.harga = harga

    @property
    def harga(self):
        return self._harga

    @harga.setter
    def harga(self, nilai):
        if nilai < 0:
            raise ValueError("harga tidak boleh negatif")
        self._harga = nilai

kopi = Menu("kopi susu", 15000)
kopi.harga = 17000
print(kopi.harga)     # 17000
kopi.harga = -5000
17000
Traceback (most recent call last):
  File "/home/darto/warung.py", line 19, in <module>
    kopi.harga = -5000
    ^^^^^^^^^^
  File "/home/darto/warung.py", line 13, in harga
    raise ValueError("harga tidak boleh negatif")
ValueError: harga tidak boleh negatif

@staticmethod dan @classmethod

class Menu:
    def __init__(self, nama, harga):
        self.nama = nama
        self.harga = harga

    @classmethod
    def dari_teks(cls, teks):
        nama, harga = teks.split(",")
        return cls(nama, int(harga))

    @staticmethod
    def diskon(total):
        if total >= 100000:
            return 15
        elif total >= 50000:
            return 10
        elif total >= 25000:
            return 5
        return 0

roti = Menu.dari_teks("roti bakar,12000")
print(roti.nama, roti.harga)   # roti bakar 12000
print(Menu.diskon(89000))      # 10
print(roti.diskon(120000))     # 15

⚠️ Jebakan yang sering ketemu

TL;DR: Decorator @... di atas def mengubah cara method dipakai. @property membuat method dibaca seperti atribut, tanpa kurung (kopi.label), dihitung ulang tiap kali dibaca; memanggilnya dengan kurung jadi TypeError: 'str' object is not callable. @harga.setter jalan saat kopi.harga = ... ditulis, bisa menolak nilai dengan raise ValueError(...), dan menyimpan angkanya di self._harga; self.harga = harga di __init__ juga lewat setter. @staticmethod gak menerima self maupun cls, cocok untuk fungsi bantu seperti diskon(total). @classmethod menerima cls (class-nya) dan sering dipakai sebagai alternative constructor seperti Menu.dari_teks(...).

Yang akan kamu pelajari