@property ialah penghias yang digunakan untuk menggantikan getter/setter dalam Python Ia boleh membungkus, memproses dan merangkum atribut kelas, dan ia juga boleh mencipta atribut baca sahaja perkara utama ialah ia Mengekalkan antara muka mudah. Kerana kita boleh mengakses sifat secara intuitif tanpa perlu menggunakan getter/setters yang membosankan seperti get_XXX dan set_XXX. Saya pada asalnya ingin menulis penjelasan yang lengkap, tetapi setelah difikirkan, saya merasakan ianya tidak cukup menyeluruh, jadi saya berputus asa dan menunggu untuk menyiapkannya pada masa akan datang Jika ada pakar lain yang tahu bidang ini, sila rasa bebas memberi pendapat kepada saya dan penanya.
@staticmethod Saya rasa ia adalah tiada kegunaan praktikal penghias yang tidak penting (jika anda mempunyai pendapat berbeza tentang perkara ini, dialu-alukan untuk berbincang, saya benar-benar mahu untuk membincangkan perkara ini) )
(Jawapan ini agak sukar. Jika anda merasa sukar untuk membaca Bahasa Cina Tradisional, anda boleh menggunakan penyemak imbas anda untuk menukarnya kepada Bahasa Cina Ringkas dan membacanya...)
@kaedah statik
Ciri dan senario penggunaan
Mari kita bincangkan tentang kaedah statik dahulu, kaedah yang diubah suai oleh kaedah statik tidak akan menerima hujah pertama yang istimewa (kaedah contoh am dan kaedah diubah suai oleh kaedah kelas strong>Kategori. kaedahakan menerima rujukan contoh dan kategori sebagai parameter pertama masing-masing), yang menjadikan kaedah statik seperti fungsi biasa, kecuali ia kebetulan ditakrifkan dalam kelas dan bukannya secara langsung di peringkat modul.
Jadi situasi penggunaannya ialah: apabila fungsi dalam kelas tidak memerlukan contoh atau kelas seperti self atau cls Apabila merujuk , menggunakan kaedah statik boleh menyelesaikan kerja dengan lebih ringkas dan cekap.
Bahagian ringkasnya ialah anda tidak perlu menerima hujah tambahan yang tidak penting
Kecekapan terletak pada fakta bahawa kaedah contoh umum ialah kaedah terikat (objek) dan dijana apabila kita mahu menggunakannya. Ini akan menelan belanja lebih sedikit, tetapi kaedah statik tidakp >
Praktikal/tidak praktikal?
Tetapi saya fikir ia tidak praktikal Pertama sekali, kita boleh menggunakan classmethod untuk fungsi yang berkaitan secara langsung dengan kelas Dalam kod, kita bergantung pada rujukan kelas yang disediakan oleh argumen pertama untuk melengkapkan operasi berkaitan Kelas (seperti penggantian __init__ atau sebagai kaedah peringkat atas yang menghantar lebih banyak subkelas staticmethod).
Jika ia tidak berkaitan dengan kelas (dan tiada kaitan dengan contoh), maka kita memerlukan tujuan kaedah statik kategori saya hanya boleh memikirkan satu buat masa ini: untuk mempunyai tahap abstrak dalam panggilan (ya, saya bercakap tentang ruang nama) Walaupun fungsi ini tidak menghubungi kelas secara langsung, ia berkaitan dengan kelas.
Tetapi dalam Python, sangat mudah untuk menggunakan ruang nama Kita mungkin juga mentakrifkan fungsi yang pada asalnya ingin kita takrifkan sebagai kaedah statik pada peringkat modul, dan meletakkannya dalam yang berkaitan. kategori sebanyak mungkin yang berdekatan, saya rasa itu sudah cukup (pendapat Luciano Ramalho).
Refleksi
Selepas saya selesai menaip perenggan di atas, saya secara khusus membaca artikel yang sangat baik oleh Julien Danjou: Panduan muktamad tentang cara menggunakan kaedah statik, kelas atau abstrak dalam Python I Artikel ini amat disyorkan untuk sesiapa yang ingin mengetahui kaedah Python.
Artikel ini mengemukakan dua kelebihan staticmethod Perkara pertama yang saya nyatakan di atas ialah kaedah statik lebih ringkas dan cekap daripada kaedah contoh. Perkara kedua ialah kaedah statik tiada kaitan dengan kelas tetapi tergolong dalam kelas, yang bermaksud bahawa mereka boleh menyesuaikan perkhidmatan untuk kelas. Ini agak sukar untuk difahami, jadi mari kita lihat contoh (contoh dalam artikel Julien Danjou):
class Pizza(objek):
@kaedah statik
def campuran_bahan(x, y):
kembalikan x + y
def masak (diri sendiri):
kembalikan diri.campuran_bahan(diri.keju, diri.sayuran)
Mari bayangkan jika kita mentakrifkan mix_ingredients pada peringkat modul, maka apabila kita berurusan dengan subclass yang mewarisi Pizza, kita tidak akan dapat menukar mix_ingredients untuk menukar tingkah laku bahan campuran (kerana fungsi ini digunakan oleh kelas lain), maka kita perlu mengatasi masak.
Sebab ini sedikit mengubah fikiran saya Sekurang-kurangnya dia menunjukkan perbezaan terbesar antara kaedah statik dan kaedah umum Kaedah statik tergolong dalam kategori tertentu.
Walau bagaimanapun, saya masih berpegang pada idea asal saya, kerana mungkin bahan_campuran boleh ditulis dengan lebih baik, atau mungkin untuk kategori bukan abstrak seperti Pizza, kita tidak sepatutnya mewarisinya sama sekali, atau mungkin mewarisi Ia tidak baik untuk mengatasi kaedah, malah saya mungkin mendapati menukar mix_ingredients membebankan seperti menukar masak.
Ringkasan
Semuanya Saya rasa mungkin suatu hari nanti kaedah statik akan digunakan dengan cara yang benar-benar elegan. Bagi anda pula? Saya rasa anda boleh mempunyai idea anda sendiri selagi anda boleh meyakinkan diri anda setelah cukup mengetahui, maka saya tidak fikir apa-apa jawatan yang salah :)
Ringkasnya
@property
ialah penghias yang digunakan untuk menggantikan getter/setter dalam Python Ia boleh membungkus, memproses dan merangkum atribut kelas, dan ia juga boleh mencipta atribut baca sahaja perkara utama ialah ia Mengekalkan antara muka mudah. Kerana kita boleh mengakses sifat secara intuitif tanpa perlu menggunakan getter/setters yang membosankan sepertiget_XXX
danset_XXX
. Saya pada asalnya ingin menulis penjelasan yang lengkap, tetapi setelah difikirkan, saya merasakan ianya tidak cukup menyeluruh, jadi saya berputus asa dan menunggu untuk menyiapkannya pada masa akan datang Jika ada pakar lain yang tahu bidang ini, sila rasa bebas memberi pendapat kepada saya dan penanya.@staticmethod
Saya rasa ia adalahtiada kegunaan praktikalpenghias yang tidak penting (jika anda mempunyai pendapat berbeza tentang perkara ini, dialu-alukan untuk berbincang, saya benar-benar mahu untuk membincangkan perkara ini) )(Jawapan ini agak sukar. Jika anda merasa sukar untuk membaca Bahasa Cina Tradisional, anda boleh menggunakan penyemak imbas anda untuk menukarnya kepada Bahasa Cina Ringkas dan membacanya...)
@kaedah statik
Ciri dan senario penggunaan
Mari kita bincangkan tentangkaedah statik dahulu, kaedah yang diubah suai oleh kaedah statik tidak akan menerima hujah pertama yang istimewa (kaedah contoh am dan kaedah diubah suai oleh
kaedah kelas
strong>Kategori. kaedahakan menerima rujukan contoh dan kategori sebagai parameter pertama masing-masing), yang menjadikan kaedah statik seperti fungsi biasa, kecuali ia kebetulan ditakrifkan dalam kelas dan bukannya secara langsung di peringkat modul.Jadi situasi penggunaannya ialah: apabila fungsi dalam kelas tidak memerlukan contoh atau kelas seperti
self
ataucls
Apabila merujuk , menggunakan kaedah statik boleh menyelesaikan kerja dengan lebih ringkas dan cekap.Bahagian ringkasnya ialah anda tidak perlu menerima hujah tambahan yang tidak penting
Kecekapan terletak pada fakta bahawa kaedah contoh umum ialah kaedah terikat (objek) dan dijana apabila kita mahu menggunakannya. Ini akan menelan belanja lebih sedikit, tetapi kaedah statik tidakp >
Praktikal/tidak praktikal?
Tetapi saya fikir ia tidak praktikal Pertama sekali, kita boleh menggunakan
classmethod
untuk fungsi yang berkaitan secara langsung dengan kelas Dalam kod, kita bergantung pada rujukan kelas yang disediakan oleh argumen pertama untuk melengkapkan operasi berkaitan Kelas (seperti penggantian__init__
atau sebagai kaedah peringkat atas yang menghantar lebih banyak subkelasstaticmethod
).Jika ia tidak berkaitan dengan kelas (dan tiada kaitan dengan contoh), maka kita memerlukan tujuan kaedah statik kategori saya hanya boleh memikirkan satu buat masa ini: untuk mempunyai tahap abstrak dalam panggilan (ya, saya bercakap tentang ruang nama) Walaupun fungsi ini tidak menghubungi kelas secara langsung, ia berkaitan dengan kelas.
Tetapi dalam Python, sangat mudah untuk menggunakan
ruang nama
Kita mungkin juga mentakrifkan fungsi yang pada asalnya ingin kita takrifkan sebagai kaedah statik pada peringkat modul, dan meletakkannya dalam yang berkaitan. kategori sebanyak mungkin yang berdekatan, saya rasa itu sudah cukup (pendapat Luciano Ramalho).Refleksi
Selepas saya selesai menaip perenggan di atas, saya secara khusus membaca artikel yang sangat baik oleh Julien Danjou:
Panduan muktamad tentang cara menggunakan kaedah statik, kelas atau abstrak dalam Python
I Artikel ini amat disyorkan untuk sesiapa yang ingin mengetahui kaedah Python.
Artikel ini mengemukakan dua kelebihan
staticmethod
Perkara pertama yang saya nyatakan di atas ialah kaedah statik lebih ringkas dan cekap daripada kaedah contoh. Perkara kedua ialah kaedah statik tiada kaitan dengan kelas tetapi tergolong dalam kelas, yang bermaksud bahawa mereka boleh menyesuaikan perkhidmatan untuk kelas. Ini agak sukar untuk difahami, jadi mari kita lihat contoh (contoh dalam artikel Julien Danjou):Mari bayangkan jika kita mentakrifkan
mix_ingredients
pada peringkat modul, maka apabila kita berurusan dengan subclass yang mewarisiPizza
, kita tidak akan dapat menukarmix_ingredients
untuk menukar tingkah laku bahan campuran (kerana fungsi ini digunakan oleh kelas lain), maka kita perlu mengatasimasak
.Sebab ini sedikit mengubah fikiran saya Sekurang-kurangnya dia menunjukkan perbezaan terbesar antara kaedah statik dan kaedah umum Kaedah statik tergolong dalam kategori tertentu.
Walau bagaimanapun, saya masih berpegang pada idea asal saya, kerana mungkinbahan_campuran boleh ditulis dengan lebih baik, atau mungkin untuk kategori bukan abstrak seperti Pizza, kita tidak sepatutnya mewarisinya sama sekali, atau mungkin mewarisi Ia tidak baik untuk mengatasi kaedah, malah saya mungkin mendapati menukar
mix_ingredients
membebankan seperti menukarmasak
.Ringkasan
Semuanya Saya rasa mungkin suatu hari nantikaedah statik akan digunakan dengan cara yang benar-benar elegan. Bagi anda pula? Saya rasa anda boleh mempunyai idea anda sendiri selagi anda boleh meyakinkan diri anda setelah cukup mengetahui, maka saya tidak fikir apa-apa jawatan yang salah :)
Soalan yang saya jawab: Python-QA