首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 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 官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。

  • __double_leading_underscore(双下划线): 从Python 1.4起为类私有名.

  • __double_leading_and_trailing_underscore__: 特殊的(magic) 对象或属性,存在于用户控制的(user-controlled)名字空间, 例如:__init____import__ 或 __file__. 有时它们被用户定义, 用于触发某个特殊行为(magic behavior)(例如:运算符重载); 有时被构造器(infrastructure)插入,以便自己使用或为了调试. 因此,在未来的版本中,构造器(松散得定义为Python解释器和标准库) 可能打算建立自己的魔法属性列表,用户代码通常应该限制将这种约定作为己用. 欲成为构造器的一部分的用户代码可以在下滑线中结合使用短前缀,例如. __bobo_magic_attr__.

另外单下划线开头还有一种一般不会用到的情况在于使用一个 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

最新文章

  1. 关于HTML5音频——audio标签和Web Audio API各平台浏览器的支持情况
  2. openssl rsa 私钥 PKCS8私钥 公钥
  3. 面试体验:Facebook 篇(转)
  4. PAT-乙级-1015. 德才论 (25)
  5. gitHub for windows设置网络代理
  6. C# 自动登录网页,浏览页面【转载】
  7. 【转】jquery两稳定版本比较~~
  8. 如何将BarTender内容锁定不让改动
  9. Android:AysncTask异步加载
  10. NEED TO DO
  11. select count(*) 底层究竟做了什么?
  12. 第二种掌握的排序Q-Q
  13. Spring Boot学习笔记:整合H2数据库
  14. [daily][archlinux][rsync] rsync
  15. BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)
  16. php API接口入门
  17. JavaScript 小知识
  18. unity3d多个版本共存
  19. 修改input的placeholder颜色
  20. oracle 单实例DG(配置篇二)

热门文章

  1. 【Docker官方文档】理解Docker
  2. 为什么rand和srand总是同时出现?
  3. 黑盒测试实践-任务进度-Day03
  4. 现代C++学习笔记之一入门篇:智能指针(C++ 11)
  5. Ref 和out
  6. - Unknown tag (c:set).
  7. (转)C# HTML解析示例---星星引发的血案
  8. BZOJ 3083 遥远的国度(树链剖分+LCA)
  9. MongoDB整理笔记のReplica Sets
  10. JAVA8 Lambda 表达式使用心得