28. Banyak object bersama

Bab 26 dan 27 membangun satu object dalam satu waktu. Class unggul ketika ada banyak object dari satu jenis yang diperlakukan sebagai kelompok: sebuah regu karakter, gerombolan musuh. Bab ini menggabungkan dua hal yang sudah kamu tahu — class (Bab 27) dan list (Bab 22) — menjadi pola sehari-hari berupa list dari object.

Class untuk banyak instance

Class Critter kecil — sebuah constructor dan dua method, pola dari Bab 27.

class Critter:
    def __init__(self, name, energy):
        self.name = name
        self.energy = energy

    def play(self):
        self.energy = self.energy - 1
        print(f"{self.name} plays. Energy: {self.energy}")

    def is_tired(self):
        return self.energy <= 0

Simpan object dalam list

Setiap pemanggilan Critter(...) mengembalikan instance baru. Simpan beberapa dalam sebuah list, seperti nilai lainnya:

critters = [
    Critter("Spark", 3),
    Critter("Bolt", 2),
    Critter("Nova", 1),
]

critters adalah list biasa (Bab 22). Yang baru adalah setiap item merupakan object dengan state dan method-nya sendiri.

Loop dan panggil method pada setiap item

Jelajahi list dengan loop for dan panggil method pada setiap object. Masing-masing beroperasi pada datanya sendiri:

for c in critters:
    c.play()

Output:

Spark plays. Energy: 2
Bolt plays. Energy: 1
Nova plays. Energy: 0

Satu loop, tiga object, tiga energy yang terpisah. Inilah gerakan inti dari kode object-oriented: simpan koleksi, operasikan sebagai kelompok, dan biarkan setiap object melacak dirinya sendiri.

Buka exercises/28/01-critters.py. Di sana sudah ada list critter yang dibuat dan masing-masing bermain sekali. Tambahkan loop kedua agar masing-masing bermain lagi, dan perhatikan energy-nya turun.

Memfilter dan menghitung object

Karena ini hanyalah list, setiap pola loop dari Bab 20 juga bekerja pada object. Hitung berapa banyak critter yang kelelahan:

tired = 0
for c in critters:
    if c.is_tired():
        tired = tired + 1
print(f"{tired} critters need a rest.")   # 1 critters need a rest.

if memanggil method (c.is_tired()) alih-alih menguji field biasa, tapi pola penghitungan tidak berubah.

Menambah dan menghapus object

list.append() dan list.pop() (Bab 24) bekerja pada list dari object sama seperti pada list dari angka:

critters.append(Critter("Zip", 5))   # a new critter joins
critters.pop(0)                      # the first one leaves

Object adalah nilai seperti lainnya — bisa ditambah, dihapus, diurutkan, dan dihitung.

Pekerjaan Rumah

File pekerjaan rumah ada di exercises/28/homework/.

Soal 1 — Regu pahlawan

Buka exercises/28/homework/01-party.py. Class Hero kecil sudah disediakan. Buat list dari tiga pahlawan dengan nama dan hit points berbeda, lalu loop ke seluruh list dan cetak nama dan HP masing-masing di baris terpisah.

Soal 2 — Total HP

Buka exercises/28/homework/02-total-hp.py. Gunakan pola akumulasi untuk menjumlahkan HP semua orang dan cetak total tim.

Soal 3 — Siapa yang terluka?

Buka exercises/28/homework/03-who-is-hurt.py. Setiap pahlawan memiliki hp dan max_hp. Loop ke seluruh regu dan cetak setiap pahlawan yang hp-nya di bawah max_hp.

Tantangan — Pahlawan terkuat

Buka exercises/28/homework/04-strongest.py. Loop ke seluruh regu dan cetak nama pahlawan dengan HP terbanyak. Gunakan ide akumulasi-maksimum: ingat yang terbaik sejauh ini, gantikan ketika menemukan yang lebih kuat.

Buntu atau sudah selesai? Buka halaman solusi pekerjaan rumah.