Seperti yang dinyatakan oleh beberapa pakar di atas, fungsi penghias (@tatabahasa) ialah:
@foo
def bar():
...
bersamaan dengan:
bar = foo(bar)
diterjemahkan ke dalam bahasa Cina ialah:
Gunakan fungsi yang diwakili oleh @ sebagai argumen untuk memanggil fungsi @ dan tetapkan nilai kepada nama fungsi @
yang diwakili oleh fungsi
Kerana tindakan ini hampir sama dengan hiasan (pengubahsuaian, pengembangan, pelarasan, sekatan...) asli bar, jadi ia dipanggil penghias:
Secara takrifan, penghias ialah fungsi yang mengambil fungsi lain dan memanjangkan gelagat fungsi terakhir tanpa mengubahnya secara eksplisit.
Walaupun
dikatakan sebagai hiasan, bar yang dilaksanakan bukan lagi orang yang sama seperti bar asal foo akan mengembalikan objek baru, biasanya fungsi, tetapi kemungkinan besar adalah benda yang dikembalikan tiada apa-apa pun
def foo(func):
return None
@foo
def bar():
...
Dalam contoh di atas,
telah menjadi penghias yang sangat aneh, kerana apa yang dikembalikan adalah foo, yang bukan sahaja tidak mempunyai hiasan, tetapi juga memusnahkan fungsiNone
Berbalik kepada contoh yang anda berikan pada permulaan:
anda tidak mempunyai pernyataan foo, yang bermaksud bahawa return akan mengembalikan foo Apa yang anda tulis pada dasarnya adalah pemusnah (gurau sahaja Kesan yang anda lihat hanyalah jangka pendek). ilusi. Itu kerana Apabila sintaks None dimainkan, sintaks @ dilaksanakan print
Tetapi anda boleh cuba memanggil
, anda akan mendapati bahawa ralat ditimbulkan, kerana func_a bukan fungsi sama sekali, dan sudah tentu kesan yang anda ingin capai tidak boleh digunakan semula func_a
Penghias tidak semestinya perlu menggunakan fungsi tempatan atau fungsi bersarang, tetapi kami biasanya membiarkan penghias mengembalikan fungsi. Lagipun, kita semua secara intuitif memikirkan fungsi yang dihias
Terdapat beribu-ribu penghias, dan sesetengahnya memang boleh menggunakan satu lapisan sarang, seperti mendaftar fungsi:
Sebabnya tindakan ini hanya perlu diproses sekali semasa dekorasi Anda tidak mahu mendaftarkannya setiap kali anda memanggil fungsi yang kami perlukan.
Tetapi untuk tindakan seperti
log pencetakan atau mengira masa dan lain-lain, kami masih perlu menggunakan teknik bersarang, kerana kami ingin mencetak dan mengira setiap kali kami memanggil fungsi need ialah fungsi baharu. Fungsi ini dicipta oleh fungsi tempatan, yang pasti akan menghasilkan lata dan bersarang Terdapat juga beberapa penghias yang lebih kompleks dengan parameter yang mungkin menggunakan lebih daripada dua peringkat bersarang
Ringkasan
Sama ada anda mahu bersarang atau tidak bergantung pada tujuan, tetapi pastikan anda ingat untuk mengembalikan fungsi selepas hiasan
Mungkin anda semua tidak faham apa yang saya maksudkan. Idea saya ini agak mengelirukan Lapisan fungsi sudah mencukupi pada kehebatan corak reka bentuk ini. Kaedah penaakulan terbalik yang digunakan adalah untuk menjelaskan keperluan asas dan kemudian membuat alasan ke belakang untuk memahami mengapa setiap langkah ditulis sedemikian.
Seperti yang dinyatakan oleh beberapa pakar di atas, fungsi penghias (@tatabahasa) ialah:
bersamaan dengan:
diterjemahkan ke dalam bahasa Cina ialah:
Kerana tindakan ini hampir sama dengan hiasan (pengubahsuaian, pengembangan, pelarasan, sekatan...) asli
Walaupunbar
, jadi ia dipanggil penghias:dikatakan sebagai hiasan,
Dalam contoh di atas,bar
yang dilaksanakan bukan lagi orang yang sama sepertibar
asalfoo
akan mengembalikan objek baru, biasanya fungsi, tetapi kemungkinan besar adalah benda yang dikembalikan tiada apa-apa puntelah menjadi penghias yang sangat aneh, kerana apa yang dikembalikan adalah
Berbalik kepada contoh yang anda berikan pada permulaan:foo
, yang bukan sahaja tidak mempunyai hiasan, tetapi juga memusnahkan fungsiNone
anda tidak mempunyai pernyataan
Tetapi anda boleh cuba memanggilfoo
, yang bermaksud bahawareturn
akan mengembalikanfoo
Apa yang anda tulis pada dasarnya adalah pemusnah (gurau sahaja Kesan yang anda lihat hanyalah jangka pendek). ilusi. Itu kerana Apabila sintaksNone
dimainkan, sintaks@
dilaksanakanprint
, anda akan mendapati bahawa ralat ditimbulkan, kerana
func_a
bukan fungsi sama sekali, dan sudah tentu kesan yang anda ingin capai tidak boleh digunakan semulafunc_a
Penghias tidak semestinya perlu menggunakan fungsi tempatan atau fungsi bersarang, tetapi kami biasanya membiarkan penghias mengembalikan fungsi. Lagipun, kita semua secara intuitif memikirkan fungsi yang dihias
log pencetakan atau mengira masa dan lain-lain, kami masih perlu menggunakan teknik bersarang, kerana kami ingin mencetak dan mengira setiap kali kami memanggil fungsi need ialah fungsi baharu. Fungsi ini dicipta oleh fungsi tempatan, yang pasti akan menghasilkan lata dan bersarang Terdapat juga beberapa penghias yang lebih kompleks dengan parameter yang mungkin menggunakan lebih daripada dua peringkat bersarang
RingkasanSoalan yang saya jawab: Python-QA
Mungkin anda semua tidak faham apa yang saya maksudkan. Idea saya ini agak mengelirukan Lapisan fungsi sudah mencukupi pada kehebatan corak reka bentuk ini. Kaedah penaakulan terbalik yang digunakan adalah untuk menjelaskan keperluan asas dan kemudian membuat alasan ke belakang untuk memahami mengapa setiap langkah ditulis sedemikian.
Penghias
berlaku dalam
定义
dan bukannya fasa执行
Fungsi penghias
outer
mesti mengembalikan被装饰的函数
, ambil perhatian bahawa ia mesti mengembalikan定义
, bukan调用
Penjelasan terperinci di tingkat bawah sangat bagus.
Mesti ramai yang pernah kongsikan ini Saya juga pernah menulis blog sebelum ini
Penjelasan terperinci tentang penghias PythonBersamaan dengan bar = foo(bar), faham sahaja ini
Tingkat dua betul, fungsi sudah dilaksanakan apabila menetapkan nilai pada bar.