26. Method dan self

Kamu sudah sering memanggil method pada object — "hello".upper(), my_list.append(x), math.floor(n). Bab ini menunjukkan cara mendefinisikan method sendiri yang melekat pada suatu object tertentu, dan apa itu self. Memahami self sekali saja akan menjelaskan banyak kode Python.

Fungsi pada object, cara panjang

Dalam Python, method hanyalah function yang didefinisikan di dalam class. Tapi sebelum membahas class, bayangkan sebuah dictionary biasa yang menyimpan counter:

counter = {"count": 0}

def step(c):
    c["count"] = c["count"] + 1

step(counter)
step(counter)
step(counter)
print(counter["count"])   # 3

Function step menerima dictionary itu sendiri sebagai argumen pertamanya, lalu menggunakannya untuk memperbarui nilai count. Setiap pemanggilan harus menyertakan counter secara eksplisit: step(counter). Ini berfungsi, tapi cara bacanya terasa janggal.

Method dan self dalam class

Sintaks class Python menyelesaikan masalah ini. Sebuah method adalah function yang didefinisikan di dalam body class. Ketika kamu memanggil obj.method(), Python secara otomatis meneruskan obj sebagai argumen pertama. Berdasarkan konvensi, parameter pertama itu dinamai self:

class Counter:
    def __init__(self):
        self.count = 0

    def step(self):
        self.count = self.count + 1

counter = Counter()
counter.step()
counter.step()
counter.step()
print(counter.count)   # 3

counter.step() persis sama dengan memanggil Counter.step(counter) — Python mengisi self secara otomatis dari object sebelum tanda titik.

Di dalam body method, self adalah parameter biasa. Tulis self.x untuk membaca sebuah field, self.x = ... untuk mengubahnya. Nama self adalah konvensi kuat di Python; setiap method harus menggunakannya.

Buka exercises/26/01-counter.py. Di sana sudah ada Counter dengan method step. Tambahkan method reset yang mengatur self.count kembali ke 0, dan panggilah dari bagian bawah file.

Pemanggilan method bawaan

Tipe bawaan Python menggunakan mekanisme yang sama. String adalah sebuah object; memanggil s.upper() meneruskan s sebagai self ke method upper milik string:

name = "keiko"

print(name.upper())    # KEIKO
print(len(name))       # 5

Setiap method yang kamu panggil pada list, string, atau dictionary bekerja dengan cara ini. Class buatanmu sendiri berperilaku sama persis.

Object game kecil

Sintaks method terlihat bagus ketika beberapa bagian state disatukan. Berikut adalah seekor anjing dengan nama dan jumlah gonggongan yang tersisa:

class Dog:
    def __init__(self, name, barks_left):
        self.name = name
        self.barks_left = barks_left

    def bark(self):
        if self.barks_left <= 0:
            print(f"{self.name} is hoarse.")
            return
        print(f"{self.name}: Woof!")
        self.barks_left = self.barks_left - 1

dog = Dog("Rex", 3)
dog.bark()       # Rex: Woof!
dog.bark()       # Rex: Woof!
dog.bark()       # Rex: Woof!
dog.bark()       # Rex is hoarse.

Object Dog menyimpan state; method mengubahnya di setiap pemanggilan. Inilah inti dari object orientation: sebuah object dengan data dan method yang beroperasi padanya.

Kesalahan umum: lupa self dalam definisi

Jika kamu lupa self sebagai parameter pertama, Python tetap meneruskan objectnya, tapi method kamu menerimanya di slot yang salah:

class Counter:
    def __init__(self):
        self.count = 0

    def step():         # missing self
        self.count += 1

c = Counter()
c.step()   # TypeError: step() takes 0 positional arguments but 1 was given

Solusinya selalu menambahkan self sebagai parameter pertama dari setiap method.

Pekerjaan Rumah

Soal 1 — Object Counter

Buka exercises/26/homework/01-counter-object.py. Buat class Counter dengan field dan method berikut:

  • self.count — dimulai dari 0.
  • inc() — menambah 1.
  • get() — mengembalikan nilai count saat ini.
  • reset() — mengatur count kembali ke 0.

Panggil semuanya secara berurutan dan cetak nilainya di setiap langkah.

Soal 2 — Anjing dengan gonggongan

Buka exercises/26/homework/02-dog.py. Buat class Dog dengan field name dan method bark() yang mencetak <name>: Woof!. Buat anjing kedua dengan nama berbeda. Panggil bark() pada keduanya dan pastikan masing-masing mencetak namanya sendiri.

Soal 3 — Object kalkulator

Buka exercises/26/homework/03-calculator.py. Buat class Calc dengan:

  • self.value — dimulai dari 0.
  • add(n) — menambah n ke self.value.
  • sub(n) — mengurangi.
  • mul(n) — mengalikan.
  • show() — mencetak nilai saat ini dengan label.

Rangkai beberapa pemanggilan dan pastikan nilainya berubah sesuai harapan.

Tantangan — Stack

Buka exercises/26/homework/04-stack.py. Buat class Stack yang berperilaku seperti stack:

  • self.items — sebuah list.
  • push(v) — menambah v ke puncak.
  • pop() — menghapus dan mengembalikan item teratas.
  • peek() — mengembalikan item teratas tanpa menghapusnya (atau None jika kosong).
  • size() — mengembalikan jumlah item yang tersimpan.

Gunakan self.items.append(v) dan self.items.pop() tanpa index — itu menambah dan menghapus di ujung list, yang merupakan perilaku stack standar.

Buntu atau sudah selesai? Buka halaman solusi pekerjaan rumah.