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"]) # 3Function 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) # 3counter.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)) # 5Setiap 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 givenSolusinya 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 dari0.inc()— menambah1.get()— mengembalikan nilai count saat ini.reset()— mengaturcountkembali ke0.
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 dari0.add(n)— menambahnkeself.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)— menambahvke puncak.pop()— menghapus dan mengembalikan item teratas.peek()— mengembalikan item teratas tanpa menghapusnya (atauNonejika 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.