Soal 1Decorator mana yang kamu gunakan untuk mendefinisikan static method?
Instance, Class, dan Static Method — Tiga Jenis Method
Pelajari tiga jenis method Python — instance, class, dan static — dengan diagram. Telusuri penggunaan self / cls / tanpa argumen pertama dan kapan memilih masing-masing.
Sebelumnya kita membahas perbedaan antara variabel class dan instance. Setiap method yang sudah kita tulis sejauh ini dalam bentuk def method(self, ...) adalah instance method, tetapi class Python memiliki dua jenis lagi — class method dan static method. Kali ini kita akan menyusun ketiga jenis dan bagaimana memilih di antaranya.
Ada Tiga Jenis Method
Method dalam class Python jatuh ke tiga jenis, dibedakan oleh apa yang mereka terima sebagai argumen pertama:
- Instance method — parameter pertama self. Menerima instance itu sendiri.
- Class method — parameter pertama cls. Menerima class itu sendiri. Didekorasi dengan @classmethod.
- Static method — tanpa parameter pertama. Tidak menerima self maupun cls. Didekorasi dengan @staticmethod.
Jenisnya menentukan apa yang bisa dijangkau setiap method. Hanya instance method yang bisa menyentuh variabel instance self.x. Class method adalah cara kamu bekerja dengan variabel class dari sisi class, dan static method adalah untuk logika murni yang tidak menyentuh keduanya.
Instance Method — Mengambil self
Bentuk def method(self, ...) yang sudah kamu tulis selama ini adalah instance method. Parameter pertama self diisi otomatis dengan instance yang memanggil method, jadi kamu bisa menjangkau variabel instance sebagai self.name.
Ketika kamu menulis apple.show(), Python secara internal menerjemahkannya menjadi Product.show(apple). Kamu bisa memikirkan method sebagai "fungsi yang menerima instance sebagai argumen pertamanya."
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def total_with_tax(self, tax_rate): # instance method
return int(self.price * (1 + tax_rate))
apple = Product("apple", 150)
print(apple.total_with_tax(0.1)) # 165
# Secara internal sama dengan ini
print(Product.total_with_tax(apple, 0.1)) # 165
__init__ menetapkan apple.price = 150 → ② memanggil apple.method(0.1) menempatkan apple ke self → ③ self.price membaca nilai yang diset pada instance.Class Method — @classmethod dan cls
Class method didefinisikan dengan decorator @classmethod, dengan cls sebagai parameter pertama (nama konvensional). cls otomatis memegang class itu sendiri — dalam kasus ini blueprint Product.
Gunakan class method ketika kamu ingin membaca atau menulis variabel class atau membangun dan mengembalikan satu instance (factory). Kamu juga bisa memanggilnya melalui instance (apple.method()), tetapi memanggilnya pada class sebagai Product.method() adalah standarnya.
class Product:
total_count = 0 # variabel class
def __init__(self, name, price):
self.name = name
self.price = price
Product.total_count += 1
@classmethod # ① mengembalikan variabel class
def get_total(cls):
return f"{cls.total_count} produk terdaftar"
@classmethod # ② membangun dan mengembalikan instance (factory)
def from_csv_row(cls, row):
name, price = row.split(",")
return cls(name, int(price))
Product("apple", 150)
Product("banana", 80)
print(Product.get_total()) # 2 produk terdaftar
orange = Product.from_csv_row("orange,120")
print(orange.name, orange.price) # orange 120
get_total(cls) (didekorasi dengan @classmethod) sebagai Product.get_total() otomatis menempatkan class Product itu sendiri ke cls. Dari sana kamu bisa menjangkau variabel class sebagai cls.total_count.def total_with_tax(self, tax_rate):- Panggilan:
apple.total_with_tax(0.1) - →
selfmenjadiapple - Menjangkau variabel instance self.price
- Didekorasi dengan
@classmethod def get_total(cls):- Panggilan:
Product.get_total()(dari class) - →
clsmenjadiProduct - Menjangkau variabel class cls.total_count
Static Method — @staticmethod
Static method didefinisikan dengan @staticmethod dan tidak menerima self maupun cls. Ini adalah "fungsi biasa yang hidup dalam class" — menyelesaikan pekerjaannya hanya dengan argumennya, tanpa akses ke variabel instance atau class.
Ini cocok untuk kasus di mana pekerjaan terkait dengan class tetapi tidak bergantung pada instance atau state class tertentu — validasi input, formatting, komputasi murni menggunakan konstanta. Gunakan untuk menyimpan fungsi utility di samping class terkait alih-alih menulisnya sebagai fungsi mandiri.
class Product:
def __init__(self, name, price):
if not Product.is_valid_price(price):
raise ValueError(f"harga tidak valid: {price}")
self.name = name
self.price = price
@staticmethod
def is_valid_price(price): # tanpa self, tanpa cls
return 0 <= price <= 1_000_000
print(Product.is_valid_price(150)) # True
print(Product.is_valid_price(-1)) # False
# Product("apple", -1) # ValueError: harga tidak valid: -1
Static Method Bekerja dari Class atau Instance
Baik Product.is_valid_price(150) maupun apple.is_valid_price(150) bekerja sama. Tetapi karena method tidak benar-benar menggunakan instance, memanggilnya pada class membuat niat lebih jelas. Menulis apple.is_valid_price(...) membuat pembaca berhenti dan bertanya-tanya "apakah ini bergantung pada state apple?" — sebaiknya dihindari.
Memilih di Antara Ketiganya
Mana yang akan digunakan bisa diputuskan secara mekanis berdasarkan "apa yang perlu disentuh method."
- Menyentuh variabel instance (self.x) → instance method
- Hanya menyentuh variabel class (cls.x) → class method
- Tidak menyentuh keduanya (hanya digerakkan argumen) → static method
Saat ragu: pertama periksa apakah kamu menyentuh variabel instance. Jika tidak, periksa variabel class. Jika tidak keduanya, static. Urutan itu tidak akan menyesatkan kamu.
self.x? Berikutnya: apakah kamu menangani variabel class? Jika tidak keduanya, static adalah pilihan tepat.| Jenis | Decorator | Param pertama | Penggunaan khas |
|---|---|---|---|
| Instance method | tidak ada | self | Method biasa yang membaca/menulis self.x |
| Class method | @classmethod | cls | Membaca/menulis variabel class, factory |
| Static method | @staticmethod | tidak ada | Validasi, formatting, logika murni |
Dengan artikel ini kamu telah membahas tiga jenis method — instance / class / static — dan cara memilih di antaranya. Itu melengkapi toolkit inti class, instance, atribut, dan method di Python. Dari sini, kamu bisa beralih ke tiga pilar pemrograman berorientasi objek: enkapsulasi (mengontrol visibilitas atribut), inheritance (membawa kemampuan dari class lain), dan polimorfisme (nama method yang sama berperilaku berbeda per tipe).
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Method mana yang paling cocok untuk @classmethod?
Soal 3Method mana yang bisa dipanggil tanpa membuat instance? (Pilih jawaban tunggal yang paling tepat jika beberapa berlaku.)