本文介绍了python中单下划线和双下划线各种含义和命名约定,名称修饰的工作原理以及他如何影响你的Python类

在文中我们将讨论五中下划线模式和命名约定,以及他们如何影响python程序的行为

1._var

2.var_

3.__var

4.__var__

5._

1.单下划线前缀

当涉及到变量和方法名称时,单下划线前缀有一个约定俗成的含义:以单下划线开头的变量或方法仅供内部使用。(注意程序的行为不受影响)

class Test:
    def __init__(self):
        self.foo=11
        self._bar=23
    def _test():
        pass

#如果你实例化了此类并且尝试访问在__init__中构造的 foo  _bar属性 会发生什么,让我们看看

>>>t=Test()
>>>t.foo
11
>>>t._bar
23

注意:

你会看到_并没有影响到我们访问属性,但是前缀下划线会影响从模块中导入名称的方式

如:当我们使用from my_module import * 

会提示:"NameError:_test() not defined"

应尽量避免使用 import *这种方式导入模块,可以直接使用 import my_module,这种方式可以正常调用 _前缀的变量和方法

2.单末尾下划线

是一个约定,是为了避免与python程序关键字冲突

3.双前导下划线

双下划线前导会导致python解释器重写属性名称,以避免与子类中属性名称冲突。

这也叫做名称修饰--解释器更改变量的名称,以便在类被扩展的时候不容易产生冲突。

如下例子:

class Test:
    def __init__(self):
        self.foo = 11
        self._bar = 23
        self.__baz=24


t=Test()
dir(t)

'''
['_Test__baz',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_bar',
 'foo']

'''

通过以上例子我们能看出来,foo,_bar都可以正常展示出来,唯独__baz变成了_Test__baz,这个时候如果我们同类去调用__baz,会提示属性名称找不到。这是为什么呢:

这是因为,解释器对__baz进行了名称修饰,这样做的目的是防止在子类中被重写。

名称修饰同样适用__开头的方法名。

4.双前尾和双后尾  __var__

不会被解释器名称修饰,一般代表的是python内部的函数或属性

5.单下划线 _

单独出现用来表示某个变量是临时的或者无关紧要的。

例子

for _ in range(10)
    pirnt('hello world')#_代表的是一个临时值

car=["1","2","3","4"]
>>>c,_,_,_=car 
#表示c=1