Python中的“Private”(实现)类
我正在编写一个由两部分组成的小型Python模块:
- 一些定义公共接口的函数,
- 上述函数使用的一个实现类,但在模块之外是没有意义的。
起初,我决定通过在函数内定义它来隐藏这个实现类,但是这会妨碍可读性,如果多个函数重用同一个类,就不能使用它。
那么,除了评论和文章外,是否有机制将class级标记为“私人”或“内部”? 我知道下划线机制,但据我所知,它只适用于variables,函数和方法名称。
使用一个下划线前缀:
class _Internal: ...
这是“内部”符号的官方Python约定; “从模块导入*”不会导入带下划线的前缀对象。
编辑:引用单个下划线约定
简而言之:
-
你不能强制保密 。 Python中没有私有的类/方法/函数。 至less,不像其他语言(如Java)那样严格保密。
-
您只能指出/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手动导入“内部”类)。