5.9. 私有函数

与大多数语言一样,Python 也有私有元素的概念

与大多数语言不同,Python 函数、方法或属性是私有的还是公共的完全由其名称决定。

如果 Python 函数、类方法或属性的名称以两个下划线开头(但不以两个下划线结尾),则它是私有的;其他所有内容都是公共的。Python 没有受保护的类方法的概念(只能在其自己的类和后代类中访问)。类方法要么是私有的(只能在其自己的类中访问),要么是公共的(可以从任何地方访问)。

MP3FileInfo 中,有两个方法:__parse__setitem__。正如您已经讨论过的,__setitem__ 是一个特殊方法;通常,您可以通过对类实例使用字典语法来间接调用它,但它是公共的,如果您有充分的理由,也可以直接调用它(即使是从 fileinfo 模块外部)。但是,__parse 是私有的,因为它的名称开头有两个下划线。

Note
Python 中,所有特殊方法(如 __setitem__)和内置属性(如 __doc__)都遵循一个标准的命名约定:它们都以两个下划线开头和结尾。不要以这种方式命名您自己的方法和属性,因为这只会让您(和其他人)以后感到困惑。

示例 5.19. 尝试调用私有方法

>>> import fileinfo
>>> m = fileinfo.MP3FileInfo()
>>> m.__parse("/music/_singles/kairo.mp3") 1
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
1 如果您尝试调用私有方法,Python 将引发一个稍微具有误导性的异常,指出该方法不存在。当然,它确实存在,但它是私有的,因此无法从类外部访问。严格来说,私有方法可以从其类外部访问,只是不容易访问。在 Python 中,没有什么东西是真正私有的;在内部,私有方法和属性的名称会动态地进行修改和还原,以使它们看起来无法通过其给定名称访问。您可以通过名称 _MP3FileInfo__parse 访问 MP3FileInfo 类的 __parse 方法。承认这很有趣,但请承诺永远不要在实际代码中这样做。私有方法之所以是私有的,是有原因的,但就像 Python 中的许多其他东西一样,它们的私密性最终是一个约定问题,而不是强制性的。

关于私有函数的进一步阅读