@staticmethod vs fungsi tingkat modul

21

Ini bukan tentang @staticmethoddan @classmethod! Saya tahu cara staticmethodkerjanya. Apa yang ingin saya ketahui adalah kasus penggunaan yang tepat untuk @staticmethodfungsi tingkat modul.

Saya telah menelusuri pertanyaan ini di Google, dan tampaknya ada beberapa kesepakatan umum bahwa fungsi tingkat modul lebih disukai daripada metode statis karena lebih pythonic. Metode statis memiliki keuntungan terikat pada kelasnya, yang mungkin masuk akal jika hanya kelas itu yang menggunakannya. Namun, dalam fungsi Python biasanya diatur oleh modul bukan kelas, jadi biasanya membuatnya menjadi fungsi modul juga masuk akal.

Metode statis juga dapat ditimpa oleh subclass, yang merupakan keuntungan atau kerugian tergantung pada bagaimana Anda melihatnya. Meskipun, metode statis biasanya "murni secara fungsional" sehingga mengesampingkannya mungkin tidak pintar, tetapi kadang-kadang mungkin nyaman (meskipun ini mungkin salah satu dari "nyaman, tapi TIDAK PERNAH MELAKUKANNYA" "hal-hal yang hanya bisa diajarkan oleh pengalaman kepada Anda).

Apakah ada aturan umum untuk menggunakan fungsi metode statis atau modul-level? Apa keuntungan atau kerugian konkret yang mereka miliki (mis. Ekstensi di masa depan, ekstensi eksternal, keterbacaan)? Jika memungkinkan, berikan juga contoh kasus.

darkfeline
sumber

Jawaban:

11

Secara teknis metode statis dan fungsi modul berperilaku cukup identik - Dalam kedua kasus mereka bekerja seperti fungsi standar, perbedaannya adalah namespace tempat mereka ditempatkan. Jadi keputusannya lebih merupakan rawatan / keterbacaan.

Secara umum saya akan menggunakan metode statis jika beberapa atau semua kriteria ini dipenuhi:

  • Sudah ada kelas yang ada dengan metode normal
  • Fungsi ini berhubungan dengan objek kelas secara umum, tetapi tidak satu contoh spesifik
  • Anda ingin dapat memanggil metode seolah-olah itu metode non-statis, mungkin karena Anda mungkin ingin membuat metode non-statis di masa depan tanpa melanggar kode klien
Michael Slade
sumber
0

Program adalah simulasi dari sepotong kenyataan. Dengan cara ini, itu tergantung pada bagaimana Anda memandang kenyataan.

Suatu fungsi mewakili beberapa aktivitas. Semakin banyak aktivitas bersifat umum, semakin besar kecenderungan untuk mensimulasikan aktivitas dengan suatu fungsi. Metode terikat ke kelas. Semakin banyak aktivitas spesifik untuk kelas, semakin cenderung untuk disimulasikan oleh suatu metode.

Pikirkan tentang fungsi trigonometri. Katakanlah, sin()sangat terkenal sehingga Anda tahu itu cocok dengan sudut. Anda tahu bahwa ia menginginkan nomor float sebagai input dan mengembalikan float. Lagi pula, bisa ada datatype sudut yang diwakili oleh kelas dan .sin()argumen tanpa bisa menjadi metode normal yang bekerja dengan objek sudut, dan .sin(x)dengan argumen tunggal bisa menjadi metode statis kelas. Saya berani bertaruh bahwa lebih banyak orang berpikir bahwa lebih baik membuat sin()fungsi yang sederhana. Mereka lebih terbiasa.

Sudut pandang lain : Modul menyerupai instance kelas. Ini memiliki variabel anggota sendiri dan fungsi anggota. Dalam beberapa hal, ini menerapkan pola tunggal. Setiap kali Anda mengimpornya dari modul aplikasi lain, Anda mendapatkan akses ke variabel dan fungsi yang persis sama.

semangat
sumber
0

Saya memiliki fungsi yang akan mengambil beberapa bagian dari hirarki data yang mendalam suatu objek sebagai argumen. Alih-alih merepotkan dalam beberapa argumen yang diperlukan untuk sampai ke bagian hierarki data. Jadi tidak punya alasan untuk referensi diri atau kb. Tetapi fungsionalitas hanya akan digunakan pada bagian-bagian objek dari kelas tertentu. Jadi sepertinya metode kelas bagi saya.

Selanjutnya, saya lebih suka mengimpor nama kelas ('dari kelas modul impor' daripada 'modul impor'). Memasukkan fungsi sebagai metode statis memberi saya akses ke metode tersebut saat menulisnya sebagai fungsi tingkat modul akan memerlukan impor yang berbeda.

Dvd Avins
sumber
2
Jika saya jadi Anda, saya akan menghindari menjawab sebagai orang pertama. Ini membingungkan. Anda sebaiknya menulis sebagai orang kedua kepada penanya.
Aaron Hall
Mungkin. Saya memberikan contoh use case, yang mungkin cocok atau tidak sesuai dengan apa yang ada di pikiran si penanya.
Dvd Avins