Belajar dengan membaca secara berurutan

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.

Apa yang Bisa Dijangkau Tiga Jenis Method
Instancemethod (self)var instance+ var class+ argsClassmethod (cls)var class+ argsStaticmethod (tdk ada)args sajamenjangkaumenjangkaumenjangkau
Instance method menjangkau var instance + var class + argumen — semuanya. Class method menjangkau var class + argumen. Static method menjangkau argumen saja.

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
Bagaimana self Memungkinkan Akses ke Variabel Instance
__init__self.price = 150appleprice = 150apple.total_with_tax(0.1)self diisiappleself.price→ 150①set②panggil③baca
__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
Bagaimana Class Method Bekerja
@classmethoddecoratordef get_total( cls):Product.get_total()cls = Product(class)cls.total_count(var class)deklarasiotomatisvia lookup
Memanggil 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.
self vs cls
Instance method
  • def total_with_tax(self, tax_rate):
  • Panggilan: apple.total_with_tax(0.1)
  • self menjadi apple
  • Menjangkau variabel instance self.price
Class method
  • Didekorasi dengan @classmethod
  • def get_total(cls):
  • Panggilan: Product.get_total() (dari class)
  • cls menjadi Product
  • Menjangkau variabel class cls.total_count
self adalah "instance yang kamu panggil"; cls adalah "class itu sendiri." Ketika pekerjaan murni tentang variabel class, melalui cls membuat niat lebih jelas.

Tulis class method get_total yang mengembalikan "jumlah produk yang dibuat sejauh ini."

① Pada class Product:, tambahkan variabel class total_count = 0.

② Pada __init__(self, name, price), setelah self.name = name / self.price = price, tulis Product.total_count += 1.

③ Definisikan get_total didekorasi dengan @classmethod dan parameter pertama cls, mengembalikan cls.total_count.

④ Bangun Product("apple", 150) dan Product("banana", 80), lalu print(Product.get_total()) dan pastikan menampilkan 2.

(Jika kamu menjalankannya dengan benar, penjelasan akan muncul.)

Python Editor

Jalankan kode untuk melihat output

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.

Tulis static method untuk validasi harga.

① Pada class Product:, definisikan is_valid_price(price) sebagai @staticmethod yang mengembalikan 0 <= price <= 1_000_000.

② Pada awal __init__(self, name, price), tulis if not Product.is_valid_price(price): raise ValueError("harga tidak valid") sebelum menetapkan self.name / self.price.

③ Pastikan Product("apple", 150) berhasil dan Product("sea_urchin", -1) gagal dengan ValueError dengan membungkusnya dalam try / except.

Python Editor

Jalankan kode untuk melihat output

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.

Alur Keputusan untuk Jenis Method
sentuhself.x?Instancemethodsentuhcls.x?Classmethodtidak sentuhkeduanyaStaticmethodlogika murnidi dalam classYaTidakYaTidakpakai
Cabang pertama: apakah kamu menyentuh variabel instance self.x? Berikutnya: apakah kamu menangani variabel class? Jika tidak keduanya, static adalah pilihan tepat.
JenisDecoratorParam pertamaPenggunaan khas
Instance methodtidak adaselfMethod biasa yang membaca/menulis self.x
Class method@classmethodclsMembaca/menulis variabel class, factory
Static method@staticmethodtidak adaValidasi, formatting, logika murni

Letakkan ketiga jenis method dalam satu class dan rasakan perbedaannya.

① Definisikan class Product: dengan variabel class total_count = 0 dan __init__(self, name, price). Pada awal __init__, raise ValueError jika Product.is_valid_price(price) gagal; jika tidak, tetapkan self.name = name / self.price = price dan jalankan Product.total_count += 1.

② Tambahkan instance method total_with_tax(self, tax_rate) yang mengembalikan int(self.price * (1 + tax_rate)).

③ Tambahkan class method get_total(cls) didekorasi dengan @classmethod yang mengembalikan cls.total_count.

④ Tambahkan static method is_valid_price(price) didekorasi dengan @staticmethod yang mengembalikan 0 <= price <= 1_000_000.

⑤ Bangun apple = Product("apple", 150) dan print baik apple.total_with_tax(0.1) maupun Product.get_total().

Python Editor

Jalankan kode untuk melihat output

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).

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Decorator mana yang kamu gunakan untuk mendefinisikan static method?

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.)