我们在定义一些变量或者方法的时候,
常常会用到下划线,
在 Python 中,下划线可是很有用处的,
比如变量、方法中的使用,
有些是一个下划线开头的:_xx,
有些是两个下划线开头的:__xx,
有些是在名称的结尾添加下划线的:xx_,
还有一些方法我们常常看到两个下划线开头和结尾的:__xx__ 等等…
下划线的运用种类
“_“
“_xx”
“xx_“
“__xx”
“__xx__“
“_classname__xx”
只有一个下划线“_”
主要用在Python解释器中
_ 会指向你最后一次执行的表达式结果
在Python 实时交互的时候常常会用到
指向最后执行的表达式

格式化变量

这样使代码中的变量值更易读
使用在循环中

首尾分别二个下划线 __xx__

这些我们叫它们为“魔法函数”
是Python 内置好了的,直接拿来用就行了
应尽量避免以这种方式命名变量
单个下划线开头的 _xx
以单个下划线开关命名的方法或者变量
就是说明它是仅提供内部使用的
举例说明
先定义好一个模块 test1.py
其中有两个方法,一个是单划线开头,一个不是

接着在第二个模块 test2 中 import test1
调用 test1 中的方法看看
当执行 my_func() 时成功


但是执行 _my_func() 时报错
“_my_func” 没有定义,
因此它只能在模块内部使用


这里有个问题是,直接 import test1
test1._my_func() 也是成功的
把 test1 模块名写在前面相当于显式内部调用吧


单个下划线结尾的 xx_
Python 中的许多关键字
def、return、class、pass、True、False等等
是不能用来命名的

如果非要使用这些系统关键词
就可以在尾部加 _

但不建议这么做,还是选用其它的名称命名吧
两个下划线开头的命名:__xx
这种命名方式更多的是用在类的继承
通过两个下划线开头命名的成员
可以防止被子类重写


这里可以看出
name 可以访问
但是 __age 无法访问的
所以就无法重写父类的 __age
打印对象的属性:

从输出的属性中可以看到
name 还是 name
但 __age 变成了 _Person__age
来来个继承看看

可以看到,name 被子类重写了,而 __age 不能访问,也没有被重写
同时,打印一下 Son 的属性看看

这里 son 类里面定义的 __age 已经变成了 _Son__age
所以要访问或重写只能这样显式调用

可以成功访问父类和子类的__age 属性
一个下划线+类名+二个下划线开头的命名:_classname__xx
可以像这样指定类名的方式命名

Python 并没有向别的编程语言那样有 private 来修饰属性进行私有化,
所以可以通过 __ 的方式进行 “伪私有化”,
不过还是可以通过实例访问得到相应的值