单下划线(如: _var):

使用单下划线,用于指定该名变量或函数属性为“私有”。这仅仅是一个惯例,不是强制规定。用于向其他程序员表明这个变量或函数仅仅供内部使用,外部不要访问它。但实际上外部还是可以访问。

在类中,单下划线开始的成员变量是保护变量,意思是只有类对象和子类对象才能访问;“双下划线”开始的私有成员,意思是只有类对象自己能访问,连子类对象也不能访问。

 一个例外是,假设在当前模块module1中使用单下划线声明了一个变量_var。在其他模块中,使用import module1 或者 from module1 import *并不会导入_var的名称。使用from module1 import _var才生效。(Python 2.7.10)

名称前双下划线(如: __var)

名称(具体为一个方法名)前双下划线(__)的用法并不是一种惯例,对解释器来说它有特定的意义。Python中的这种用法是为了避免与子类定义的 名称冲突。Python文档指出,“__spam”这种形式(至少两个前导下划线,最多一个后续下划线)的任何标识符将会被 “_classname__spam”这种形式原文取代,在这里“classname”是去掉前导下划线的当前类名。例如下面的例子:

1
2
3
4
5
6
7
8
>>> class A(object):
... def _internal_use(self):
... pass
... def __method_name(self):
... pass
...
>>> dir(A())
['_A__method_name', ..., '_internal_use']

正如所预料的,“_internal_use”并未改变,而“__method_name”却被变成了“_ClassName__method_name”。此时,如果你创建A的一个子类B,那么你将不能轻易地覆写A中的方法“__method_name”。

1
2
3
4
5
6
>>> class B(A):
... def __method_name(self):
... pass
...
>>> dir(B())
['_A__method_name', '_B__method_name', ..., '_internal_use']

这里的功能几乎和Java中的final方法和C++类中标准方法(非虚方法)一样。

 同样地,假设在当前模块module1中使用单下划线声明了一个变量__var。在其他模块中,使用import module1 或者 from module1 import *并不会导入__var的名称。使用from module1 import __var才生效。(Python 2.7.10)

名称前后的双下划线(如:__init__)

这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写 这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。

虽然你也可以编写自己的特殊方法名,但不要这样做。

1
2
3
4
5
6
>>> class C(object):
... def __mine__(self):
... pass
...
>>> dir(C)
... [..., '__mine__', ...]

其实,很容易摆脱这种类型的命名,而只让Python内部定义的特殊名称遵循这种约定。

参考文献:

  1. http://www.zhihu.com/question/19754941

  2. http://python.jobbole.com/81129/

  3. http://www.chengxuyuans.com/Python/67370.html

最新文章

  1. MyBatis中关于别名typeAliases的设置
  2. HDU5838 Mountain(状压DP + 容斥原理)
  3. hdu1521 排列组合(指数型母函数)
  4. NYOJ背包问题
  5. complex(x):创建一个复数
  6. Java验证码和ajax判断
  7. apache http配置https
  8. Buffer深入分析
  9. if __name__ == '__main__' 如何正确理解
  10. Angular CLI: 发布到 GitHub Pages
  11. ubuntu 下安装 navicat 12
  12. 数据库 的几种链接 join
  13. Linux下 刚安装完mysql 修改密码
  14. Flask源码解读--所有可扩展点
  15. Android: 待机时如何让程序继续运行 extends Service
  16. CNC系统的多任务并行处理
  17. 循环while 和 continue
  18. Tornado/Python 学习笔记(二)
  19. 解决CentOS7 无法启动mysql 的解决办法
  20. 接口测试基础——第7篇 Python中_、__、__func__之间的区别

热门文章

  1. Goland的常用快捷键
  2. C++的特点
  3. Java设计模式(16)——行为模式之模板方法模式(Template)
  4. Luogu P1802 5倍经验日_KEY
  5. 成都Uber优步司机奖励政策(4月7日)
  6. 你的APK安全吗?来WeTest免费测!
  7. Qt-QSplashScreen-程序启动动画
  8. JavaScript --经典问题
  9. commons-lang源码解析之StringUtils
  10. Attention注意力机制介绍