Python中的“Private”(实现)类

我正在编写一个由两部分组成的小型Python模块:

  • 一些定义公共接口的函数,
  • 上述函数使用的一个实现类,但在模块之外是没有意义的。

起初,我决定通过在函数内定义它来隐藏这个实现类,但是这会妨碍可读性,如果多个函数重用同一个类,就不能使用它。

那么,除了评论和文章外,是否有机制将class级标记为“私人”或“内部”? 我知道下划线机制,但据我所知,它只适用于variables,函数和方法名称。

使用一个下划线前缀:

class _Internal: ... 

这是“内部”符号的官方Python约定; “从模块导入*”不会导入带下划线的前缀对象。

编辑:引用单个下划线约定

简而言之:

  1. 你不能强制保密 。 Python中没有私有的类/方法/函数。 至less,不像其他语言(如Java)那样严格保密。

  2. 您只能指出/build议隐私 。 这遵循一个惯例。 将类/函数/方法标记为私有的Python约定是以_(下划线)作为前缀。 例如, def _myfunc()class _MyClass: 你也可以用两个下划线(例如: __foo )来创build伪隐私。 你不能直接访问这个方法,但是你仍然可以通过一个使用类名的特殊前缀来调用它(例如: _classname__foo )。 所以你可以做的最好的是表明/build议隐私,而不是强制执行它。

Python在这方面就像perl。 用Perl的书来解释一个关于隐私的着名的话,哲学是你应该呆在起居室里,因为你没有被邀请,而不是因为它是用霰弹枪来防守的。

了解更多信息:

  • 私有variables Python文档
  • 私人function由Mark Pilgrim 潜入Python
  • 为什么Python的“私有”方法实际上不是私有的? StackOverflow问题70528

定义__all__ ,您想要导出的名称列表( 请参阅文档 )。

 __all__ = ['public_class'] # don't add here the 'implementation_class' 

我有时使用的模式是这样的:

定义一个类:

 class x(object): def doThis(self): ... def doThat(self): ... 

创build类的一个实例,覆盖类名称:

 x = x() 

定义公开function的符号:

 doThis = x.doThis doThat = x.doThat 

删除实例本身:

 del x 

现在你有一个只公开你的公共职能的模块。

约定在内部类,函数和variables前加“_”。

为了解决devise惯例的问题,正如克里斯托弗所说,Python中实际上没有“私有”的东西。 对于来自C / C ++背景的人来说,这可能听起来有些扭曲(像我一会儿回来),但是最终你可能意识到以下惯例已经足够了。

看到前面有下划线的东西应该是一个足够好的暗示,不要直接使用它。 如果你关心混乱的help(MyClass)输出(这是每个人在查找如何使用类时都会看到的),那么强调的属性/类不包含在那里,所以你最终只会让你的“public “界面介绍。

另外,公开所有东西都有它自己的好处,例如,你可以从外部对任何东西进行unit testing(对于C / C ++私有构造你不能这样做)。

使用两个下划线作为“私有”标识符的名称的前缀。 对于模块中的类,使用单个前导下划线,并且不会使用“from module import *”导入它们。

 class _MyInternalClass: def __my_private_method: pass 

(在Python中没有真正的“private”,例如,Python只会自动将带有双下划线的类成员的名字改为__clssname_mymember 。所以,如果你知道被改名的名字,你可以使用“private”实体无论如何, 看到这里 ,当然你也可以select手动导入“内部”类)。