根据http://www.faqs.org/docs/diveintopython/fileinfo_private.html:
像大多数语言一样,Python具有
私有元素的概念:
私人
函数,这些函数不能被调用
在模块外
然而,如果我定义两个文件:
#a.py
__num=1
and:
#b.py
import a
print a.__num
当我运行b.py时,它输出1而不给出任何异常。是diveintopython错了,还是我误解了什么?是否有方法将模块的函数定义为私有?
这个问题没有得到完全的回答,因为模块私密性并不完全是常规的,而且使用import可能会识别模块私密性,也可能不会,这取决于它的使用方式。
如果你在一个模块中定义了私有名称,这些名称将被导入到任何使用'import module_name'语法的脚本中。因此,假设您在示例中正确定义了模块private, _num,在a.py中,如下所示..
#a.py
_num=1
..你可以在b.py中使用模块名符号来访问它:
#b.py
import a
...
foo = a._num # 1
要从a.py中只导入非私有对象,你必须使用from语法:
#b.py
from a import *
...
foo = _num # throws NameError: name '_num' is not defined
然而,为了清晰起见,在从模块中导入名称时最好显式,而不是用'*'导入它们:
#b.py
from a import name1
from a import name2
...
In Python, "privacy" depends on "consenting adults'" levels of agreement - you can't force it (any more than you can in real life;-). A single leading underscore means you're not supposed to access it "from the outside" -- two leading underscores (w/o trailing underscores) carry the message even more forcefully... but, in the end, it still depends on social convention and consensus: Python's introspection is forceful enough that you can't handcuff every other programmer in the world to respect your wishes.
((顺便说一下,虽然这是一个严格保密的秘密,但对于c++来说也是如此:在大多数编译器中,在#包括你的.h文件之前,一个简单的#define private public line就可以让狡猾的编码器对你的“隐私”进行散列…!-))
抱歉我回答晚了,但是在一个模块中,你可以像这样定义包来“导出”:
mymodule
__init__.py
library.py
main.py
我的模块/库.py
# 'private' function
def _hello(name):
return f"Hello {name}!"
# 'public' function which is supposed to be used instead of _hello
def hello():
name = input('name: ')
print(_hello(name))
mymodule里/ __init__ . py
# only imports certain functions from library
from .library import hello
main.py
import mymodule
mymodule.hello()
尽管如此,函数仍然可以被访问,
from mymodule.library import _hello
print(_hello('world'))
但这种方法使其不那么明显
见PEP8指南:
方法名称和实例变量
Use the function naming rules: lowercase with words separated by underscores as necessary to improve
readability.
Use one leading underscore only for non-public methods and instance
variables.
To avoid name clashes with subclasses, use two leading underscores to
invoke Python’s name mangling rules.
Python mangles these names with the class name: if class Foo has an
attribute named __a, it cannot be accessed by Foo.__a. (An insistent
user could still gain access by calling Foo._Foo__a.) Generally,
double leading underscores should be used only to avoid name conflicts
with attributes in classes designed to be subclassed.
为传承而设计
Always decide whether a class’s methods and
instance variables (collectively: “attributes”) should be public or
non-public. If in doubt, choose non-public; it’s easier to make it
public later than to make a public attribute non-public.
Public attributes are those that you expect unrelated clients of your
class to use, with your commitment to avoid backwards incompatible
changes. Non-public attributes are those that are not intended to be
used by third parties; you make no guarantees that non-public
attributes won’t change or even be removed.
We don’t use the term “private” here, since no attribute is really
private in Python (without a generally unnecessary amount of work).