1 Python中 _的作用

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
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值