python3 模块 public缀_在python中定义私有模块函数

根据http:/ / / / /文档www.faqs.org diveintopython FileInfo _ private.html:

Like most languages, Python has the

concept of private elements:

Private

functions, which can't be called from

outside their module

然而,如果一个文件的定义:

#a.py

__num=1

和:

#b.py

import a

print a.__num

当我运行它打印出b.py1没有给任何异常。diveintopython是错误的,或我misunderstand的东西吗?有一些单和待办事项模块的功能定义为一私人?

这并不是说diveintopython是错误的,而是在它们的示例中:>>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") 1 Traceback (innermost last): File"", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse'fileinfo.mp3fileinfo()是类的一个实例。使用双下划线时会出现此异常。而在您的案例中,您没有创建类,只是创建了一个模块。另请参见:stackoverflow.com/questions/70528/…

在python中,"隐私"取决于"同意的成年人"的协议水平——你不能强迫它(比你在现实生活中所能做的还要多;—)。一个前导下划线意味着您不应该"从外部"访问它——两个前导下划线(不带尾随下划线)可以更有力地传递消息…但是,归根结底,它仍然依赖于社会惯例和共识:Python的内省足够有力,以至于你不能用手铐束缚世界上的其他程序员来尊重你的愿望。

(BTW,虽然它是一个紧密持有的秘密,对于C++是一样的:对于大多数编译器来说,在EDCOX1之前的一个简单的EDCOX1 3行,4的EDCOX1×5的文件是所有狡猾的代码编写者的"隐私"的散列所需要的。-)

关于C++的注释是不正确的。通过使用define private public,您将更改发送到编译器的代码,这就是名称管理发生的地方。

此外,C++的修饰是晦涩难懂的,但却不是秘密的。你可以"反思"一个由C++产生的二进制。哦,对不起。

作为对@rhinrepose的更新,根据标准,用预处理器宏重新定义关键字不仅不正确,而且是未定义的行为。

可以使用闭包将变量设为私有,然后返回要导出的变量。

@亚历克马尔泰利并不像它所得到的那样是个私生子。它至少对链接器是隐藏的,并且可以通过内联完全删除该函数。

在现实生活中,如果人们违法,就会受到起诉。

阶级私密和模块私密之间可能存在混淆。

模块private以一个下划线开头当使用import命令的from import *形式时,不会复制这样的元素;但是,如果使用import语法,则会导入该元素(请参见Ben Wilhelm的回答)。只需从问题的示例中删除一个下划线,它就不会显示在使用from a import *语法导入a.py的模块中。

一个班的私底下有两个下划线(也叫d under,即得分低的D-ouble)。这样一个变量的名称"mangled"包括类名等。它仍然可以通过损坏的名称在类逻辑之外访问。尽管名称管理可以作为一种轻微的防止未经授权访问的设备,但它的主要目的是防止可能的名称与祖先类的类成员冲突。见亚历克斯·马泰利有趣但准确地提到了同意的成年人,因为他描述了关于这些变量的惯例。

>>> class Foo(object):

...    __bar = 99

...    def PrintBar(self):

...        print(self.__bar)

...

>>> myFoo = Foo()

>>> myFoo.__bar  #direct attempt no go

Traceback (most recent call last):

File"", line 1, in

AttributeError: 'Foo' object has no attribute '__bar'

>>> myFoo.PrintBar()  # the class itself of course can access it

99

>>> dir(Foo)    # yet can see it

['PrintBar', '_Foo__bar', '__class__', '__delattr__', '__dict__', '__doc__', '__

format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__',

'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__

', '__subclasshook__', '__weakref__']

>>> myFoo._Foo__bar  #and get to it by its mangled name !  (but I shouldn't!!!)

99

>>>

嗯,蒂尔。但是,他们为什么不执行模块级__private_function呢?我遇到了这个,因此出错了。

根据stackoverflow.com/a/13618522/3155195,对单个下划线的解释是错误的。

@森帕德,谢谢你指出这一点!我修改了我的答案来修正这个错误。

@MJV:谢谢你修理!

这应该是公认的答案

谢谢你的好话@terrabits,但我很高兴站在亚历克斯的第二位(远远落后!)关于所有的"Python"。此外,由于亚历克斯对语言和社会做出了广泛的贡献,他的回答通常更加简洁和幽默,同时保持了高度的权威性。

@这是一个很有帮助的解释!谢谢您!有一段时间我对这种行为感到很困惑。如果您试图直接访问private类,我真希望选择抛出某种类型的错误,而不是attributeError;也许"privateaccessError"或其他更明确/更有用的东西。(因为获取没有属性的错误实际上不是真的)。

这个问题没有得到完全的回答,因为模块隐私不是纯粹的传统,而且由于使用import,可能会或可能不会识别模块隐私,这取决于如何使用它。

如果在模块中定义私有名称,这些名称将被导入使用语法"import module_name"的任何脚本。因此,假设您在示例中正确地定义了模块private,_num,in a.py,like so.。

#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

...

谢谢您!我想知道为什么江户十一〔二〕还在工作。

在哪里指定导入哪些函数/库?在iT.Py?

当使用import a调用_names时,不存在名称冲突的风险——使用这种样式时,它们作为a._names进行访问。

@是的,您指定在__init__.py文件中导入的函数。请看这里,以获得一些帮助。

python允许使用双下划线前缀的私有类成员。这种技术在模块级别上不起作用,所以我认为这是深入到Python中的一个错误。

下面是私有类函数的示例:

class foo():

def bar(self): pass

def __bar(self): pass

f = foo()

f.bar()   # this call succeeds

f.__bar() # this call fails

我认为OP的目的是写一些在商业软件包之外不可访问的函数。在这方面,这个答案并不完整。_uu bar()函数仍然可以通过f.o_uu bar()从外部访问。因此,双前导下划线不会使其成为私有的。

可以添加内部函数:

def public(self, args):

def private(self.root, data):

if (self.root != None):

pass #do something with data

如果你真的需要这样的隐私的话。

为什么这不是最好的答案?

这是一个古老的问题,但是模块私有(一个下划线)和类私有(两个下划线)损坏的变量现在都包含在标准文档中:

Python教程?课堂?私有变量

嵌入闭包或函数是一种方法。这在JS中很常见,但对于非浏览器平台或浏览器工作人员不需要。

在Python中,这看起来有点奇怪,但是如果确实需要隐藏一些东西,那么可能就是这样。更重要的是,使用PythonAPI并将需要隐藏在C语言(或其他语言)中的内容保留下来可能是最好的方法。如果失败,我将把代码放在函数中,调用它并让它返回您想要导出的项。

python有三种模式via.、private、public和protected,当导入模块时,只有public模式可以访问,所以private和protected模块不能从模块外部调用,即导入时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值