Saya mengkodekan modul Python kecil yang terdiri dari dua bagian:
- beberapa fungsi yang mendefinisikan antarmuka publik,
- kelas implementasi yang digunakan oleh fungsi-fungsi di atas, tetapi tidak berarti di luar modul.
Pada awalnya, saya memutuskan untuk "menyembunyikan" kelas implementasi ini dengan mendefinisikannya di dalam fungsi yang menggunakannya, tetapi ini menghambat keterbacaan dan tidak dapat digunakan jika beberapa fungsi menggunakan kembali kelas yang sama.
Jadi, selain komentar dan dokumen, apakah ada mekanisme untuk menandai kelas sebagai "pribadi" atau "internal"? Saya mengetahui mekanisme garis bawah, tetapi seperti yang saya pahami, ini hanya berlaku untuk variabel, fungsi, dan nama metode.
sumber
Pendeknya:
Anda tidak dapat memaksakan privasi . Tidak ada kelas / metode / fungsi privat di Python. Setidaknya, privasi tidak ketat seperti di bahasa lain, seperti Java.
Anda hanya dapat menunjukkan / menyarankan privasi . Ini mengikuti konvensi. Konvensi python untuk menandai kelas / fungsi / metode sebagai privat adalah untuk mengawali dengan _ (garis bawah). Misalnya,
def _myfunc()
atauclass _MyClass:
. Anda juga dapat membuat pseudo-privacy dengan mengawali metode dengan dua garis bawah (misalnya:)__foo
. Anda tidak dapat mengakses metode secara langsung, tetapi Anda masih dapat memanggilnya melalui awalan khusus menggunakan nama kelas (misalnya:)_classname__foo
. Jadi yang terbaik yang dapat Anda lakukan adalah menunjukkan / menyarankan privasi, bukan menegakkannya.Python seperti perl dalam hal ini. Untuk memparafrasekan baris terkenal tentang privasi dari buku Perl, filosofinya adalah Anda harus tetap berada di luar ruang tamu karena Anda tidak diundang, bukan karena dilindungi dengan senapan.
Untuk informasi lebih lanjut:
sumber
Tentukan
__all__
, daftar nama yang ingin Anda ekspor ( lihat dokumentasi ).sumber
Pola yang terkadang saya gunakan adalah ini:
Tentukan kelas:
Buat instance kelas, yang menimpa nama kelas:
Tentukan simbol yang mengekspos fungsionalitas:
Hapus instance itu sendiri:
Sekarang Anda memiliki modul yang hanya mengekspos fungsi publik Anda.
sumber
Konvensi ini menambahkan "_" ke kelas, fungsi, dan variabel internal.
sumber
Untuk mengatasi masalah konvensi desain, dan seperti yang dikatakan Christopher, sebenarnya tidak ada yang namanya "pribadi" dalam Python. Ini mungkin terdengar aneh bagi seseorang yang berasal dari latar belakang C / C ++ (seperti saya beberapa waktu lalu), tetapi pada akhirnya, Anda mungkin akan menyadari bahwa mengikuti konvensi sudah cukup.
Melihat sesuatu yang memiliki garis bawah di depan seharusnya menjadi petunjuk yang cukup baik untuk tidak menggunakannya secara langsung. Jika Anda khawatir dengan
help(MyClass)
keluaran yang berantakan (yang dilihat semua orang saat mencari tentang cara menggunakan kelas), atribut / kelas yang digarisbawahi tidak disertakan di sana, jadi Anda hanya akan mendapatkan penjelasan antarmuka "publik".Selain itu, memiliki semua yang bersifat publik memiliki keistimewaannya sendiri yang luar biasa, seperti misalnya, Anda dapat menguji hampir semua hal dari luar (yang tidak dapat Anda lakukan dengan konstruksi pribadi C / C ++).
sumber
Gunakan dua garis bawah untuk mengawali nama pengenal "pribadi". Untuk kelas dalam modul, gunakan satu garis bawah dan mereka tidak akan diimpor menggunakan "from module import *".
(Tidak ada yang namanya benar "pribadi" dalam Python. Sebagai contoh, Python hanya secara otomatis merusak nama anggota kelas dengan garis bawah ganda menjadi
__clssname_mymember
. Jadi sungguh, jika Anda tahu nama yang rusak Anda dapat menggunakan entitas "pribadi". . Lihat di sini. Dan tentu saja Anda dapat memilih untuk secara manual impor "internal" kelas jika Anda ingin).sumber