Как я могу ограничить, какие функции можно вызывать из импортированного модуля? Могу ли я сделать функцию приватной? (Питон)

Например, в файле A.py у меня есть функции: a(), b() и c(). Я импортирую A.py в B.py, но хочу ограничить функции a() и b(). так что из B.py я смогу вызывать только c(). Как я могу это сделать? Есть ли публичные, приватные функции?


person abhera    schedule 08.11.2017    source источник


Ответы (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
person Yaroslav Surzhikov    schedule 08.11.2017
comment
Но тогда вы могли бы просто сделать import A.A. - person eje211; 08.11.2017

Действительно в Python все публично. Так что при желании вы можете назвать что угодно.

Стандартный подход к сокрытию заключается в том, чтобы называть методы двойным подчеркиванием, например __method. Таким образом, Python искажает их имена как _class__method, поэтому их нельзя найти как __merhod, но они действительно доступны с длинным именем.

person Eugene Lisitsky    schedule 08.11.2017

Как сказал @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 разработан с предположением, что люди не захотят нарушать инкапсуляцию.

person eje211    schedule 08.11.2017

Вы можете попробовать использовать _single_leading_underscore.

_single_leading_underscore Это соглашение используется для объявления закрытых переменных, функций, методов и классов в модуле. Все, что соответствует этому соглашению, игнорируется в from module import *.

Однако, конечно, Python не поддерживает по-настоящему приватные, поэтому мы не можем форсировать что-то приватное, а также можем вызывать его напрямую из других модулей. Поэтому иногда мы говорим «слабый индикатор внутреннего использования».

person Sri Divya    schedule 08.11.2017