Например, в файле A.py у меня есть функции: a(), b() и c(). Я импортирую A.py в B.py, но хочу ограничить функции a() и b(). так что из B.py я смогу вызывать только c(). Как я могу это сделать? Есть ли публичные, приватные функции?
Как я могу ограничить, какие функции можно вызывать из импортированного модуля? Могу ли я сделать функцию приватной? (Питон)
Ответы (4)
Вы можете сделать A.py
пакет Python со следующей структурой:
B.py
A/
|-- __init__.py
`-- A.py
__init__.py:
from .A import c
A.py ( пример ):
def a():
return 'a'
def b():
return 'b'
def c():
print(a(), b(), 'c')
B.py (пример):
import A
A.c() # a b c
A.a() # AttributeError: 'module' object has no attribute 'a'
A.b() # not executed because of exception above
import A.A
.
- person eje211; 08.11.2017
Действительно в Python все публично. Так что при желании вы можете назвать что угодно.
Стандартный подход к сокрытию заключается в том, чтобы называть методы двойным подчеркиванием, например __method
. Таким образом, Python искажает их имена как _class__method
, поэтому их нельзя найти как __merhod
, но они действительно доступны с длинным именем.
Как сказал @Eugene, в Python нет ничего личного. Это не то, чего не хватает. Сохранение всего общедоступным — вот как работает Python.
Это видео Java-программиста из НАСА, который приводит простой пример некоторых преимуществ Python перед Java: https://youtu.be/4VJoOdpLESw
Это еще один из основных разработчиков Python, Рэймонд Хеттингер, объясняет, как использовать классы Python: https://youtu.be/HTLu2DFOdTg. а> . Это покажет, почему вам не нужно хранить что-либо приватным в Python. Python — это не Java; это не С++. Это даже не TypeScript.
Оба они относятся к Python 2, но довольно хорошо применимы к Python 3. Есть различия, но суть одна.
Если вы действительно этого хотите, вы можете сделать элементы неизменяемыми в CPython с помощью Python API. Но это очень продвинуто. В общем, Python разработан с предположением, что люди не захотят нарушать инкапсуляцию.
Вы можете попробовать использовать _single_leading_underscore.
_single_leading_underscore Это соглашение используется для объявления закрытых переменных, функций, методов и классов в модуле. Все, что соответствует этому соглашению, игнорируется в from module import *.
Однако, конечно, Python не поддерживает по-настоящему приватные, поэтому мы не можем форсировать что-то приватное, а также можем вызывать его напрямую из других модулей. Поэтому иногда мы говорим «слабый индикатор внутреннего использования».