30. Merancang class kecil — Solusi pekerjaan rumah
File solusi .py ada di
exercises/30/homework/solutions/.
Soal 1 — Class Counter
Solusi.
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count = self.count + 1
def get(self):
return self.count
def reset(self):
self.count = 0
c = Counter()
c.increment()
c.increment()
c.increment()
print(c.get()) # 3
c.reset()
print(c.get()) # 0Soal 2 — Health yang dibatasi
Cara berpikir. Terapkan "tetap antara 0 dan max" di
dalam heal dan damage, sehingga tidak ada
pemanggil yang bisa mendorong health keluar dari rentang.
Solusi.
class Health:
def __init__(self, max):
self.max = max
self.current = max
def heal(self, n):
self.current = self.current + n
if self.current > self.max:
self.current = self.max
def damage(self, n):
self.current = self.current - n
if self.current < 0:
self.current = 0
def get(self):
return self.current
h = Health(100)
h.damage(30)
print(h.get()) # 70
h.heal(1000)
print(h.get()) # 100 (capped at max)
h.damage(9999)
print(h.get()) # 0 (floored at 0)Soal 3 — Saklar lampu
Solusi.
class Switch:
def __init__(self):
self.on = False
def toggle(self):
self.on = not self.on
def is_on(self):
return self.on
s = Switch()
print(s.is_on()) # False
s.toggle()
print(s.is_on()) # True
s.toggle()
print(s.is_on()) # Falseself.on = not self.on membalik boolean setiap
pemanggilan — seluruh saklar dalam satu baris.
Tantangan — Stack dengan penjagaan
Soal. pop() pada stack kosong
mengembalikan None alih-alih crash.
Solusi.
class Stack:
def __init__(self):
self.items = []
def push(self, v):
self.items.append(v)
def pop(self):
if len(self.items) == 0:
return None
return self.items.pop()
def size(self):
return len(self.items)
s = Stack()
s.push("a")
s.push("b")
print(s.size()) # 2
print(s.pop()) # b
print(s.pop()) # a
print(s.pop()) # None (empty, but no crash)
print(s.size()) # 0list.pop() pada list kosong memunculkan
IndexError, sehingga penjagaan memeriksa panjang terlebih
dahulu. Itulah aturan yang dijaga method ini.
Selesai?
Itulah akhir Bagian 6. Kamu bisa membangun class, membuat banyak instance, melakukan inheritance, meng-override, dan merancang permukaan publik yang bersih dan aman. Bagian 6 memiliki dua mini-proyek: Sistem Inventori dan Monster Battle, keduanya dibangun dari object-object yang bekerja sama.