|
Python for experienced programmers |
3.8. 私有函数
象大多数语言,Python也有私有函数的概念,私有函数不可以从它们的模块外面被调用;私有类方法,不能够从它们的类外面被调用;并且私有属性,不能够从它们的类外面被使用。不象大多数的语言,一个Python函数,方法,或属性是私有还是公有,完全取决于它的名字。
在 MP3FileInfo 中,有两个方法:__parse 和 __setitem__。正如我们已经讨论过的,__setitem__
是一个专有方法;通常,你不直接调用它,而是通过在一个类上使用字典语法来调用,但它是公有的,并且如果有一个真正好的理由,你可以直接调用它(甚至从
fileinfo 模块的外面)。然而,__parse 是私有的,因为在它的名字前面有两个下划线。
|
如果一个Python函数的名字,类方法,或属性以两个下划线开始(但不是结束),它是私有的;其它所有的都是公有的。
|
|
在Python中,所有的专用方法(象__setitem__)和内置属性(象__doc__)遵守一个标准的命名习惯:开始和结束都有两个下划下。不要对你自已的方法和属性用这种方法命名;它后面只会搞乱你(或其它人)。
|
|
Python没有类方法保护的概念(只能用于它们自已的类和子父中)。类方法要不私有(只能在它们自已的类中使用)要不公有(任何地方都可使用)。
|
例 3.16. 尝试调用一个私有方法
>>> 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将引发一个有些误导的异常,宣称那个方法不存在。当然它确实存在,但是它是私有的,所以在类外是不可使用的。[4]
|
[4] 严格地说,私有方法在它们的类外是有效的,只是不容易处理。在Python中没有什么是真正私有的;在内部,私有方法和属性的名字被忽然破坏和修补(译注:原文为“internally,
the names of private methods and attributes are mangled and unmangled on the
fly to make them seem inaccessible by their given names.”,但不知道“mangled and unmangled
on the fly”应如何翻译为好),以致于使得它们看上去用它们给定的名字是无法使用的。你可以通过 _MP3FileInfo__parse
名字来使用 MP3FileInfo 类的 __parse 方法。知道了这个方法很有趣,然后要保证决不在真正的代码中使用它。私有方法由于某种原因而私有,但是象其它很多在Python中的东西一样,它们的私有化基本上是习惯问题,而不是强迫的。