Menurut http://www.faqs.org/docs/diveintopython/fileinfo_private.html :
Seperti kebanyakan bahasa, Python memiliki konsep elemen pribadi:
- Fungsi pribadi, yang tidak dapat dipanggil dari luar modul mereka
Namun, jika saya mendefinisikan dua file:
#a.py
__num=1
dan:
#b.py
import a
print a.__num
ketika saya menjalankannya b.py
mencetak 1
tanpa memberikan pengecualian. Apakah diveintopython salah, atau apakah saya salah mengerti sesuatu? Dan ada beberapa cara untuk melakukan mendefinisikan fungsi modul sebagai pribadi?
>>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") 1 Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
fileinfo.MP3FileInfo () adalah turunan dari kelas. Yang memberikan pengecualian ini ketika Anda menggunakan garis bawah ganda. Sedangkan dalam kasus Anda, Anda tidak membuat kelas, Anda baru saja membuat modul. Lihat juga: stackoverflow.com/questions/70528/…Jawaban:
Dalam Python, "privasi" bergantung pada tingkat persetujuan "orang dewasa" - Anda tidak dapat memaksanya (lebih dari yang Anda bisa dalam kehidupan nyata ;-). Satu garis bawah utama berarti Anda tidak seharusnya mengaksesnya "dari luar" - dua garis bawah utama (tanpa garis bawah garis) membawa pesan lebih kuat ... tetapi, pada akhirnya, masih tergantung pada sosial konvensi dan konsensus: Introspeksi Python cukup kuat sehingga Anda tidak dapat memborgol setiap programmer lain di dunia untuk menghormati keinginan Anda.
((Btw, meskipun ini adalah rahasia yang dipegang erat, hampir sama berlaku untuk C ++: dengan sebagian besar kompiler,
#define private public
garis sederhana sebelum#include
ing.h
file Anda adalah semua yang diperlukan untuk pembuat kode cerdik untuk membuat hash "privasi" Anda ...! -) )sumber
static void foo()
didapatnya. Setidaknya disembunyikan ke linker, dan fungsinya dapat dihapus seluruhnya dengan inlining.Mungkin ada kebingungan antara privat kelas dan privat modul .
Sebuah modul pribadi dimulai dengan satu garis bawah
elemen tersebut tidak disalin bersama saat menggunakan
from <module_name> import *
bentuk perintah import; namun diimpor jika menggunakanimport <moudule_name>
sintaks ( lihat jawaban Ben Wilhelm )Cukup hapus satu garis bawah dari nomor .__ dari contoh pertanyaan dan itu tidak akan ditampilkan dalam modul yang mengimpor a.py menggunakan
from a import *
sintaks.Sebuah kelas privat dimulai dengan dua garis bawah (alias Dunder yaitu d-ouble bawah skor)
variabel tersebut memiliki nama "hancur" untuk menyertakan classname dll
Hal ini masih bisa diakses di luar logika kelas, melalui nama hancur.
Meskipun nama mangling dapat berfungsi sebagai alat pencegahan ringan terhadap akses yang tidak sah, tujuan utamanya adalah untuk mencegah kemungkinan tabrakan nama dengan anggota kelas dari kelas leluhur. Lihat referensi Alex Martelli yang lucu tapi akurat untuk memberikan persetujuan pada orang dewasa saat dia menggambarkan konvensi yang digunakan terkait dengan variabel-variabel ini.
sumber
__private_function
? Saya mengalami ini dan mendapat kesalahan karena itu.Pertanyaan ini tidak sepenuhnya dijawab, karena privasi modul tidak sepenuhnya konvensional, dan karena menggunakan impor mungkin atau mungkin tidak mengenali privasi modul, tergantung bagaimana penggunaannya.
Jika Anda mendefinisikan nama pribadi dalam modul, nama-nama itu akan diimpor ke skrip yang menggunakan sintaks, 'import module_name'. Jadi, anggap Anda telah mendefinisikan dengan benar dalam contoh Anda modul privat, _num, dalam a.py, seperti itu ..
..you akan dapat mengaksesnya di b.py dengan simbol nama modul:
Untuk hanya mengimpor non-privat dari a.py, Anda harus menggunakan sintaks dari :
Namun, demi kejelasan, sebaiknya eksplisit ketika mengimpor nama dari modul, daripada mengimpor semuanya dengan '*':
sumber
_names
dipanggil denganimport a
- mereka diakses sepertia._names
ketika menggunakan gaya ini.__init__.py
file. Lihat di sini untuk bantuan tentang itu.Python memungkinkan untuk kelas privat anggota dengan awalan garis bawah ganda. Teknik ini tidak berfungsi pada level modul jadi saya pikir ini adalah kesalahan dalam Dive Into Python.
Berikut adalah contoh fungsi kelas privat:
sumber
Anda dapat menambahkan fungsi bagian dalam:
Sesuatu seperti itu jika Anda benar-benar membutuhkan tingkat privasi itu.
sumber
Ini adalah pertanyaan kuno, tetapi kedua variabel modul privat (satu garis bawah) dan kelas-privat (dua garis bawah) sekarang tercakup dalam dokumentasi standar:
Tutorial Python » Kelas » Variabel Pribadi
sumber
tertanam dengan penutupan atau fungsi adalah satu cara. Ini biasa terjadi di JS meskipun tidak diperlukan untuk platform atau browser non-browser.
Dalam Python sepertinya agak aneh, tetapi jika sesuatu benar-benar perlu disembunyikan daripada itu mungkin jalan. Lebih tepatnya menggunakan python API dan menjaga hal-hal yang perlu disembunyikan di C (atau bahasa lain) mungkin merupakan cara terbaik. Gagal bahwa saya akan pergi untuk menempatkan kode di dalam fungsi, memanggil itu dan mengembalikannya barang yang ingin Anda ekspor.
sumber
Python memiliki tiga mode via., Private, public, dan protected. Sementara mengimpor modul, hanya mode publik yang dapat diakses.
sumber