本文介绍了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