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

时间:2017-11-08 03:54:32

标签: python function import module restrictions

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

4 个答案:

答案 0 :(得分:3)

真的在Python中都是公开的。所以,如果你希望你可以打电话。

标准隐藏方法是使用双下划线命名方法,如__method。这样,Python将其名称伪装成_class__method,因此找不到__merhod,但确实可以使用长名称。

答案 1 :(得分:1)

您可以使A.py成为具有以下结构的python包:

B.py  
A/
|-- __init__.py
`-- A.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

答案 2 :(得分:0)

正如@Eugene所说,Python中没有任何内容。这不是缺少的东西。保持一切公开是Python的工作方式。

这是来自美国国家航空航天局的Java程序员的视频,它提供了Python相对于Java的一些优点的简单示例:https://youtu.be/4VJoOdpLESw

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

这些都是关于Python 2的,但适用于Python 3.存在差异,但精神是相同的。

如果你真的想,你可以使用Python API在CPython中使成员不可变。但那非常先进。一般来说,Python的设计假设人们不愿意打破封装。

答案 3 :(得分:0)

您可以尝试使用_single_leading_underscore。

  

_single_leading_underscore   此约定用于声明模块中的私有变量,函数,方法和类。从模块导入*中忽略具有此约定的任何内容。

     

然而,当然,Python不支持真正的私有,所以我们不能强迫某些私有的,也可以直接从其他模块调用它。所以有时我们会说它是“弱内部使用指标”。