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())   # 0

Soal 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())    # False

self.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())   # 0

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