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 <= 0Simpan 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 leavesObject 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.