多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 5.9. 私有函数 与大多数语言一样,Python 也有私有的概念: * 私有函数不可以从它们的模块外面被调用 * 私有类方法不能够从它们的类外面被调用 * 私有属性不能够从它们的类外面被访问 与大多数的语言不同,一个 Python 函数,方法,或属性是私有还是公有,完全取决于它的名字。 如果一个 Python 函数,类方法,或属性的名字以两个下划线开始 (但不是结束),它是私有的;其它所有的都是公有的。 Python 没有类方法_保护_ 的概念 (只能用于它们自已的类和子类中)。类方法或者是私有 (只能在它们自已的类中使用) 或者是公有 (任何地方都可使用)。 在 `MP3FileInfo` 中,有两个方法:`__parse` 和 `__setitem__`。正如我们已经讨论过的,`__setitem__` 是一个[专有方法](special_class_methods.html#fileinfo.specialmethods.setitem.example "例 5.13. __setitem__ 专用方法");通常,你不直接调用它,而是通过在一个类上使用字典语法来调用,但它是公有的,并且如果有一个真正好的理由,你可以直接调用它 (甚至从 `fileinfo` 模块的外面)。然而,`__parse` 是私有的,因为在它的名字前面有两个下划线。 > 注意 > 在 Python 中,所有的专用方法 (像 [`__setitem__`](special_class_methods.html#fileinfo.specialmethods.setitem.example "例 5.13. __setitem__ 专用方法")) 和内置属性 (像 [`__doc__`](../getting_to_know_python/everything_is_an_object.html#odbchelper.import "例 2.3. 访问 buildConnectionString 函数的 doc string")) 遵守一个标准的命名习惯:开始和结束都有两个下划线。不要对你自已的方法和属性用这种方法命名;到最后,它只会把你 (或其它人) 搞乱。 ## 例 5.19. 尝试调用一个私有方法 ``` >>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse' ``` | | | | --- | --- | | \[1\] | 如果你试图调用一个私有方法,Python 将引发一个有些误导的异常,宣称那个方法不存在。当然它确实存在,但是它是私有的,所以在类外是不可使用的。严格地说,私有方法在它们的类外是可以访问的,只是不_容易_ 处理。在 Python 中没有什么是真正私有的;在内部,私有方法和属性的名字被忽然改变和恢复,以致于使得它们看上去用它们给定的名字是无法使用的。你可以通过 `_MP3FileInfo__parse` 名字来使用 `MP3FileInfo` 类的 `__parse` 方法。知道了这个方法很有趣,然后要保证决不在真正的代码中使用它。私有方法由于某种原因而私有,但是像其它很多在 Python 中的东西一样,它们的私有化基本上是习惯问题,而不是强迫的。 | ## 进一步阅读 * _Python Tutorial_ 讨论了[私有变量](http://www.python.org/doc/current/tut/node11.html#SECTION0011600000000000000000)的内部工作方式。