Kursus Pembangunan Python Lanjutan
Bab
>
Tahap
Dekorator
Dekorator yang lebih kompleks
Objektif
Letakkan pizza dalam ketuhar pada suhu yang betul dan sediakan salad dengan menggunakan decorator dengan argumen.
Kini kerana pizza sudah disediakan, tiba masanya untuk memasaknya dalam ketuhar. Setelah itu selesai, kita harus sediakan salad untuk dihidangkan bersama pizza selepas dimasak. Anda boleh melaksanakan tugas-tugas ini dengan menggunakan decorator dengan argumen, serupa dengan fungsi kebiasaan, anda juga boleh menyalurkan argumen melalui decorator anda.
Pizza perlu dimasukkan ke dalam ketuhar tetapi dahulu anda perlu mengumpul lebih banyak "firewood" di bahagian bawah kiri peta. Setelah dikumpulkan, ambil bakul di kaunter berhampiran ketuhar sebelah kiri, bakul ini mengandungi "pizza" yang hendak dibakar dalam ketuhar.
Terdapat satu fungsi dan decorator-nya telah disediakan dalam editor kod; fungsi tersebut digunakan untuk meletakkan dan membakar "pizza" dalam ketuhar, manakala decorator memeriksa sama ada ketuhar mempunyai suhu yang betul dan jika tidak, "firewood" akan diletakkan sebagai gantinya.
def place_oven(func):
def check(temp):
if temp < 450:
player.speak("Oven is not hot enough")
player.open()
player.place("firewood")
player.close()
return
return func(temp)
return check
@place_oven
def bake_pizza(temp):
player.open()
player.place("pizza")
player.close()
player.speak("I am baking Pizza at %d degrees" % (temp))
Berjalan ke tanda X yang ringan dan gunakan fungsi read() sambil menghadap ketuhar untuk mengenalpasti suhu ketuhar. Seterusnya, tulis fungsi yang dihiasi bake_pizza() dan tambahkan suhu yang anda baca sebagai argumen, contohnya: bake_pizza(450).
Sementara anda meletakkan pizza dan firewood dalam ketuhar, berhenti di tanda X yang berwarna emas dan menghadap almari, di sini anda boleh mengumpul bahan-bahan untuk menyediakan salad. Pada masa ini, bahan salad disimpan dalam list bersarang seperti yang ditunjukkan dalam editor kod, namun senarai ini agak berantakan dan adalah untuk kepentingan anda menyimpan item-item tersebut dalam list yang betul untuk kegunaan salad anda.
cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]
Cipta satu list bernama ingredients dan gunakan List Comprehension untuk “meratakan” list bersarang tersebut. Ini adalah proses mengeluarkan sub-list daripada list bersarang supaya semua item kini berada dalam satu list sahaja dan bukannya beberapa list kecil. Selepas list tersebut diratakan, gunakan fungsi speak() dengan list untuk mengesahkan bahan-bahan yang akan anda gunakan.
Selepas semua item yang diperlukan telah diletakkan dalam ketuhar, dan list ingredients telah ditangani, berjalanlah ke tanda X yang gelap untuk mencipta salad. Dalam editor, satu fungsi dan decorator telah disediakan; kali ini, mereka tidak disambungkan dan mesti diisytiharkan secara manual, contohnya: salad = add_toppings(toss_salad("ranch","carrot")). Set fungsi ini mengambil dua (2) argumen: dressing dan vegetable.
def add_toppings(func):
def add(dressing, vegetable):
player.place(dressing)
player.place(vegetable)
func(dressing, vegetable)
return add
@add_toppings
def toss_salad(dressing, vegetable):
player.combine("lettuce", dressing, vegetable)
player.speak("I am preparing salad with %s dressing and %s"
% (dressing, vegetable))
Setiap tanda X yang gelap terletak di atas karpet berwarna, setiap satunya mempunyai salad yang berbeza yang perlu disediakan dengannya menggunakan bahan-bahan yang anda ambil dari almari. Di atas karpet kuning, sediakan salad menggunakan: "cesar" dan "cheese", di atas karpet hijau sediakan salad menggunakan: "oil" dan "tomato", dan di atas karpet biru sediakan salad menggunakan: "ranch" dan "carrot".
Setelah ketiga-tiga (3) salad itu disediakan menggunakan fungsi yang dihiasi toss_salad(dressing, vegetable) dalam format ini, tahap akan diselesaikan.