Python中的下划线
转载请标明出处(http://blog.csdn.net/lis_12/article/details/52693115)
1.单下划线
1)解释器中
_符号指交互解释器中最后一次执行语句的结果。
2)名称
_也可用作被丢弃的名称,如for i in range(30),但是i用不到,可以舍弃i,用_代替似的代码更加直观。
for _ in range(30):
dosomething()
2.以单下划线为前缀的变量名
1)正常使用
以“_”做前缀的变量是私有的。当外部python文件使用from module import *的时候,以”_”开头的变量、函数不会被导入。但是可以利用import module module._var
来访问变量。
双下划线开头的变量或者函数也是如此哦!
2)类
以_开头的变量或者函数视为保护成员,按理说只有类内部和子类可以访问,外部不该访问,但是可以访问。
3.双下划线前缀的变量名
1)正常使用
以双下划线做前缀的变量(特别是方法名)对解释器来说是有特定含义的。解释器将之视为私有成员,在使用from module import * 导入模块的时候,”__“开头的变量和函数不会被导入,但是可以利用module.__var的方式来访问。
2)类
在类中,以双下划线做前缀的变量被视为私有成员,这些变量只有类的内部才能访问到,子类和外部不能访问。但是可以使用非常手段访问(以_classname__var就能访问到)。
Python会改写以双下划线开头的变量名称,以免与子类中定义的名称产生冲突。任何以__spam这种形式(至少以两个下划线做开头,绝大部分都还有一个下划线做结尾)的标识符,都会被替换为_classname__spam,其中classname是当前类名,并带上一个下划线做前缀。
看下面这个例子:
>>> 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了:
>>> classB(A):
… def __method_name(self):
… pass
>>> dir(B())
[‘_A__method_name’,’_B__method_name’,…,’_internal_use’]
这种特定的行为差不多等价于Java中的final方法和C++中的正常方法(非虚方法),可以理解为最终的方法,不会被再次修改
前后都带有双下划线的变量(例如__init__)
Python系统名称,一般只有在重写类中的方法才会使用这种命名。
4.测试code
class Foo():
def __init__():
...
def public_method():
print 'This is public method'
def __fullprivate_method():
print 'This is private method'
def _halfprivate_method():
print 'This is protect method'
f = Foo()
f.public_method() # OK
f.__fullprivate_method() # Error occur 私有方法,不能访问
f._halfprivate_method() # OK、
f._Foo__fullprivate()_method() # OK 私有方法会被转化为_类名字+方法名,这种形式则可以访问到
test.py
_a = 1
b = 2
__c = 3
def _f1():
print "_f1"
def __f2():
print '__f2'
test_use.py
from test import * #不会导入带_ __
import test #但是利用module._a 可以访问
if __name__ == '__main__':#主程序
'''如果模块是被导入的 __name__为文件名字,如果是直接执行的,__name__ 为__main__'''
try:
_f1()
except:
print "f1 exception" # exception
try:
__f2()
except:
print "f2 exception" #exception
try:
print _a
except:
print "a exception" #exception
try:
print b
except:
print "f1 exception" #ok
print test._a #ok
print test.__c #ok
test._f1() #ok
test.__f2() #ok