5.9. 私有函数
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 5.9. 私有函数

与大多数语言一样，Python 也有私有的概念：

- 私有函数不可以从它们的模块外面被调用
- 私有类方法不能够从它们的类外面被调用
- 私有属性不能够从它们的类外面被访问

与大多数的语言不同，一个 Python 函数，方法，或属性是私有还是公有，完全取决于它的名字。

如果一个 Python 函数，类方法，或属性的名字以两个下划线开始 (但不是结束)，它是私有的；其它所有的都是公有的。 Python 没有类方法保护 的概念 (只能用于它们自已的类和子类中)。类方法或者是私有 (只能在它们自已的类中使用) 或者是公有 (任何地方都可使用)。

在 `MP3FileInfo` 中，有两个方法：`__parse` 和 `__setitem__`。正如我们已经讨论过的，`__setitem__` 是一个专有方法；通常，你不直接调用它，而是通过在一个类上使用字典语法来调用，但它是公有的，并且如果有一个真正好的理由，你可以直接调用它 (甚至从 `fileinfo` 模块的外面)。然而，`__parse` 是私有的，因为在它的名字前面有两个下划线。

在 Python 中，所有的专用方法 (像 `__setitem__`) 和内置属性 (像 `__doc__`) 遵守一个标准的命名习惯：开始和结束都有两个下划线。不要对你自已的方法和属性用这种方法命名；到最后，它只会把你 (或其它人) 搞乱。

### 例 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'

| 如果你试图调用一个私有方法，Python 将引发一个有些误导的异常，宣称那个方法不存在。当然它确实存在，但是它是私有的，所以在类外是不可使用的。严格地说，私有方法在它们的类外是可以访问的，只是不容易 处理。在 Python 中没有什么是真正私有的；在内部，私有方法和属性的名字被忽然改变和恢复，以致于使得它们看上去用它们给定的名字是无法使用的。你可以通过 `_MP3FileInfo__parse` 名字来使用 `MP3FileInfo` 类的 `__parse` 方法。知道了这个方法很有趣，然后要保证决不在真正的代码中使用它。私有方法由于某种原因而私有，但是像其它很多在 Python 中的东西一样，它们的私有化基本上是习惯问题，而不是强迫的。

### 进一步阅读

- Python Tutorial 讨论了私有变量的内部工作方式。