1,以一个下划线开头的命名 ,如_getfile2,以两个下划线开头的命名 ,如__filename3,以两个下划线开头和结尾的命名,如 __init__()4,其它这些命名有什么不同吗? 回复内容:
首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var 这样的形式访问到这样的对象。在 python 的官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和 python 关键词区分开来,比如如果我们需要一个变量叫做 class,但 class 是 python 的关键词,就可以以单下划线结尾写作 class_。双下划线开头的命名形式在 python 的类成员中使用表示名字改编 (name mangling),即如果有一 test 类里有一成员 __x,那么 dir(test) 时会看到 _test__x 而非 __x。这是为了避免该成员的名称与子类中的名称冲突。但要注意这要求该名称末尾没有下划线。双下划线开头双下划线结尾的是一些 python 的“魔术”对象,如类成员的 __init__、__del__、__add__、__getitem__ 等,以及全局的 __file__、__name__ 等。 python 官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。另外单下划线开头还有一种一般不会用到的情况在于使用一个 c 编写的扩展库有时会用下划线开头命名,然后使用一个去掉下划线的 python 模块进行包装。如 struct 这个模块实际上是 c 模块 _struct 的一个 python 包装。更多关于命名的内容可以参考 pep 8 《代码风格指南》的 name conventions 一节:http://www.python.org/dev/peps/pep-0008/需要说明的是,由于这份文档看起来经过多次修改,双下划线开头的用法似乎曾经如 @makestory 所说,建议为类的私有成员,至少啄木鸟社区的 pep 8 译文是这样写的,但 pep 8 当前的官方版本中并没有体现。啄木鸟的译文参考:http://wiki.woodpecker.org.cn/moin/pythoncodingrule另找到一份较新的译文参考:http://code.google.com/p/zhong-wiki/wiki/pep8
参考我翻译的一篇译文:python中的下划线(译文)
[sorry 之前的回答有个失误,私有方法应该是双下划线,已更正]这不是类的命名吧?应该是类方法的。两个下划线开头的,是一个私有方法命名,但是python的私有方法并不是一个真正的私有方法,因为它还是能够被外部访问的,只不过是不能被简单的直接调用了。以两个下划线开头和结尾的命名,都是一些特殊的方法,成为一些操作符或某些行为的钩子(比如 加减乘除、初始化、迭代等)。单下划线的我不知道,但是有个常见用法是 _() 用于做 i18n 。比如 _(‘hello’) = > ‘你好’
pyton2.7中,模块中的单下划线和双下划线开头的成员都是私有成员,不能用from module import *访问,但是可以用import module访问
object.__format__()这里边的下划线是什么意思的呢