如何限制可从导入的模块调用哪些函数?我可以将函数设为私有吗? (Python)

How can I restrict which functions are callable from an imported module? Can I make a function private? (Python)

例如,在文件A.py中我有函数:a()、b()和c()。我导入A.py到B.py,但是我想限制函数a()和b()。这样从B.py我就只能调用c()了。我怎样才能做到这一点?是否有 public、私有函数?

真的在Python都是public。所以如果你愿意,你可以打电话给任何人。

标准的隐藏方法是用双下划线命名方法,如__method。这样 Python 将他们的名字打乱为 _class__method,所以他们找不到 __merhod,但确实可以使用长名字 .

你可以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

正如@Eugene 所说,Python 中没有什么是私有的。这不是缺少的东西。保持一切 public 是 Python 的工作方式。

这是来自 Nasa 的 Java 程序员的视频,他给出了 Python 相对于 Java 的一些优点的简单示例:https://youtu.be/4VJoOdpLESw

这是另一位 Python 核心开发人员 Raymond Hettinger,解释了如何使用 Python 类: https://youtu.be/HTLu2DFOdTg 。它将显示为什么您不需要在 Python 中保留任何私有内容。 Python 不是 Java;它不是 C++。它甚至不是 TypeScript。

这两个都是关于Python2的,但是对Python3的应用还算不错。有区别,但是精神是一样的。

如果您确实需要,可以使用 Python API 使 CPython 中的成员不可变。但这是非常先进的。一般来说,Python是在人们不愿意破坏封装的前提下设计的。

您可以尝试使用 _single_leading_underscore。

_single_leading_underscore This convention is used for declaring private variables, functions, methods and classes in a module. Anything with this convention are ignored in from module import *.

However, of course, Python does not supports truly private, so we can not force somethings private ones and also can call it directly from other modules. So sometimes we say it “weak internal use indicator”.