Python中的下划线可以分为单下划线"_ "和双下划线 “__”。与变量和函数名称有一下几种组合:
- 在名称前面:_name和__name
- 在名称后面: name_和name__
- 前后都有: name 和 __ name __
- 不和名称结合:_
在名称前面
单下划线
单下划线在名称前面只是约定俗成的使用方式,用来说明该变量或者函数只是内部使用。但这不是python解释器强制的,只是对代码使用者或者阅读者的提示。
需要注意的一点,如果函数,方法,类的名称使用单下划线开头,使用import *引入该模块的时候是不能够被引入的
双下划线
双下划线就厉害了。通过dir可以看到以双下划线开头的名字会被修改,前面添加了类的名称。
双下划线会使解释器修改名称,用来避免子类的命名冲突。它可以当做类里面的私有变量或者函数来使用。但并不是严格的私有方法,通过修改后的名称仍然可以访问。
class MyTest():
def __init__(self):
self.aa = 1
self.__aa = 2
def __ss(self):
return self.aa
test = MyTest()
#test.__aa
print(dir(test))
print(test.__ss)
['_MyTest__aa', '_MyTest__ss', '__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__', 'aa']
Traceback (most recent call last):
File "test_.py", line 16, in <module>
print(test.__ss)
AttributeError: 'MyTest' object has no attribute '__ss'
在名称后面
单下划线
单下划线在名字后面通常应用与避免与python中的关键字冲突。
def student(name, class_)
双下划线
这个和单下划线差不多,基本不会用到。
前后都有
双下划线
一般是系统定义的名称,或者用于操作符重载。单张自己定义最好不要使用这种风格的命名,避免与python产生冲突。
单独下划线
单下划线
一种情况是用来表示某个变量是临时的或者不需要关注的,比如忽略函数的某个返回值或者for循环中条件变量。
ret,- = get_result()
for _ in range(10):
dosomething()
还有一个使用方法是获取最近表达式的结果。
> 3 + 2
> 5
> _
> 5