最新消息:

python 里面下划线使用以及单下划线与双下划线的区别

Python 大步 1765浏览 0评论
这篇文章讨论python中的下划线的使用。

单下划线(_)

有三种典型的情况下会使用:
1.在解释器(interpreter)中使用:在交互式的解释器会话中,使用单下划线指向上一条语句的执行结果。这个首先被标准CPython解释器使用,而后其他解释器也跟着这样做了。(python除了常用的CPython解释器,还有IPython、PyPy、Jython等)。

 

2.作为一个名字:这点与上面的那种情况有点相关。单下划线被作为a throw-away name(这里实在不好翻,我估计翻译为“一个随意的名字”)。这样将允许以后阅读你代码的人知道,按照习惯,这是一个被分配了的确定的名字,但是并不打算去使用这个名字。例如,你可能对于一个循环计数器的实际值并不感兴趣:

 

3.i8n(国际化):这种情况下,单下划线是被作为函数使用。在这种情况下,它经常作为一个名称,用于实现查找国际化和本地化的字符串翻译的功能。这个习惯似乎是来自于C语言。比如,我们在Django文档中翻译一节中,可以如下使用,来实现程序的国际化:

 

注意,第三种与第二种情况有冲突,所以我们要避免在任何代码块中既用单下划线来查找翻译实现国际化,同时又将单下划线作为a throw-away name。

在名称前的单下划线(如 _shahriar)

作为惯例,通过在名称前使用单下划线来指定该名称为私有的。这样后面使用的人就知道以单下划线开头的方法或属性只能内部使用,不要去直接访问这些属性。python文档中的解释如下:
a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.
对于解释器,如果你使用 from <module/package> import * ,以单下划线开头的那些属性和方法并不会被导入,除非这个模块的或包的__all__列表明确的包含它们。详见“Importing * in Python”

在名称前的双下划线(如 __shahriar)

在名称前使用双下划线,这对于解释器有特殊的含义。这样能避免与子类中定义的相同名称产生冲突。Python文档中的解释:任何以类似__spam(至少两个下划线开头,最多一个下划线结尾)的形式的标识符都会被替换为_classname__spam ,其中classnam是当前类的名字。
见下面的例子:
实例1:

 

上面例子中的_internal_use 并未改变,而__method_name 变成了_ClassName__method_name 。现在,如果你创建一个A的子类,其中也有个__method_name ,则可能会覆盖A中的__method_name 。

 

加双下划线的作用 类似于java中的final方法和 C++中的非虚拟函数。
实例2:

 

运行结果:

 

我们将上面的代码修改下,去掉双下划线:

 

运行结果:

 

可见,去掉双下划线,则子类的中方法会覆盖父类中同名的方法。所以,使用双下划线的目的,是为了防止该方法被任何人重写,并且只能在这个类中访问这个方法。
python中使用所谓的名称重整(name mangle)来实现私有属性或方法。
但是请注意,因为python中根本就无法阻止我们访问这些所谓的私有变量或方法。我们还是可以通过在变量名或方法名前加上下划线和类名,来方法这个所谓的私有变量或方法

 

名称前后都有双下划线(比如,__int__)

表明这个方法是python来调用的,而不是用户来调用。这样能避免Python系统内部的名称与用户自定义的名称起冲突。你可以在python调用这些方法时候,重写这些方法,并且定义成你想要的样子。比如,我们常常在写一个类的时候,重写__int__方法 ,然后在创建的时候被python调用__int__方法,在构建实例是有python调用__new__()

 

 

虽然我们也能够在自己写方法前后都加上双下划线,但是请不要这么做。

 

Python 用下划线作为变量前缀和后缀指定特殊变量。
_xxx 不能用'from moduleimport *'导入
__xxx__ 系统定义名字
__xxx 类中的私有变量名
核心风格:避免用下划线作为变量名的开始。
因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
"双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。
结论:
1、_xxx 不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。
2、__xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以。当然要方法还是可以得,使用_className__method()就可以了
3、__xxx___ 定义的是特列方法。像__init__之类的
参考:
Underscores in Python
Python: Why do some functions have underscores “__” before and after the function name?

转载请注明:大步's Blog » python 里面下划线使用以及单下划线与双下划线的区别

SiteMap