Согласно http://www.faqs.org/docs/diveintopython/fileinfo_private.html :
Как и большинство языков, в Python есть концепция приватных элементов:
- Частные функции, которые нельзя вызывать извне их модуля
Однако, если я определю два файла:
#a.py
__num=1
и:
#b.py
import a
print a.__num
когда я запускаю, b.py
он печатается 1
без каких-либо исключений. Является ли diveintopython неправильно, или я что-то неправильно понял? И есть ли какой - нибудь способ сделать определить функцию модуля , как частные?
>>> 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 () является экземпляром класса. Что дает это исключение, когда вы используете двойное подчеркивание. В то время как в вашем случае вы не создали класс, вы просто создали модуль. См. Также: stackoverflow.com/questions/70528/…Ответы:
В Python «конфиденциальность» зависит от уровня «согласия взрослых» - вы не можете его заставить (больше, чем можете в реальной жизни ;-). Одно лидирующее подчеркивание означает, что вы не должны получать к нему доступ «извне» - два лидирующих подчеркивания (без конечных подчеркиваний) несут сообщение еще более убедительно ... но, в конце концов, оно все еще зависит от социальных соглашение и согласие: самоанализ Python достаточно силен, чтобы вы не могли надеть наручники любого другого программиста в мире, чтобы уважать ваши пожелания.
(Между прочим, хотя это и держится в секрете, то же самое относится и к C ++: с большинством компиляторов простая
#define private public
строчка перед#include
вашим.h
файлом - все, что нужно хитрым кодировщикам для хеша вашей "конфиденциальности" ...! -) )источник
static void foo()
такой частный, как сейчас. По крайней мере, он скрыт для компоновщика, и функция может быть полностью удалена путем встраивания.Может быть путаница между рядовыми и рядовыми .
Закрытый модуль начинается с одного подчеркивания.
Такой элемент не копируется при использовании
from <module_name> import *
формы команды импорта; однако он импортируется при использованииimport <moudule_name>
синтаксиса ( см. ответ Бена Вильгельма ).Просто удалите одно подчеркивание из числа .__ примера вопроса, и он не будет отображаться в модулях, импортирующих a.py с использованием
from a import *
синтаксиса.А класс частные начинается с двумя символами подчеркивания (ака Dunder т.е. d-ouble под Score)
Такой переменный имеют свое название «искаженное» включить имя класса и т.д.
Это все еще может быть доступны за пределы класса логики, через искаженное имя.
Хотя искажение имени может служить средством для предотвращения несанкционированного доступа, его основная цель - предотвратить возможные конфликты имен с членами классов классов-предков. См. Забавную, но точную ссылку Алекса Мартелли на согласных взрослых, когда он описывает соглашение, используемое в отношении этих переменных.
источник
__private_function
? Я столкнулся с этим и попал в ошибки из-за этого.На этот вопрос не был дан полный ответ, поскольку конфиденциальность модуля не является чисто условной, и поскольку использование импорта может распознавать или не распознавать конфиденциальность модуля в зависимости от того, как он используется.
Если вы определите личные имена в модуле, эти имена будут импортированы в любой скрипт, использующий синтаксис «имя_модуля импорта». Таким образом, предполагая, что вы правильно определили в своем примере модуль private, _num, в a.py, вот так ..
..Вы можете получить доступ к нему в b.py с символом имени модуля:
Чтобы импортировать только неприватные файлы из a.py, вы должны использовать синтаксис from :
Для ясности, однако, лучше быть явным при импорте имен из модулей, а не импортировать их все с помощью «*»:
источник
_names
вызове с ним не возникает риска конфликтов именimport a
- они являются доступами, какa._names
при использовании этого стиля.__init__.py
файл. Смотрите здесь для некоторой помощи по этому вопросу.Python позволяет для частного класса члены с префиксом двойного подчеркивания. Этот метод не работает на уровне модулей, поэтому я думаю, что это ошибка в Dive Into Python.
Вот пример функций частного класса:
источник
Вы можете добавить внутреннюю функцию:
Нечто подобное, если вам действительно нужен этот уровень конфиденциальности.
источник
Это древний вопрос, но в стандартной документации теперь рассматриваются как закрытые для модуля (одно подчеркивание), так и закрытые для класса (два подчеркивание) переменные:
The Python Tutorial » Классы » Частные переменные
источник
встроенный с замыканиями или функциями является одним из способов. Это часто встречается в JS, но не требуется для не браузерных платформ или рабочих браузеров.
В Python это кажется немного странным, но если что-то действительно нужно скрыть, это может быть способом. Более конкретно, использование Python API и хранение вещей, которые должны быть скрыты в C (или другом языке), возможно, лучший способ. В противном случае я бы пошел, чтобы поместить код в функцию, вызвать ее и заставить возвращать элементы, которые вы хотите экспортировать.
источник
В Python есть три режима через., Приватный, публичный и защищенный. При импорте модуля доступен только публичный режим. Поэтому частные и защищенные модули не могут быть вызваны извне модуля, т. Е. Когда он импортирован.
источник