Python 中各种下划线的骚操作:_、_xx、xx_、__xx、__xx__、_classn...

共 1663字,需浏览 4分钟

 ·

2020-02-08 23:23


我们在定义一些变量或者方法的时候,常常会用到下划线,在 Python 中,下划线可是很有用处的哟,比如变量,有些是一个下划线开头的(_xx),有些是两个下划线开头的(__xx),有些是在名称的结尾添加下划线的(xx_),还有一些方法我们常常看到两个下划线开头和结尾的(__xx__) 等等…
为什么要这么写呢?它们都代表什么意思?我们以后如何定义好这些名称呢?那么接下来就是:


学习 Python 的正确姿势
d083c42606607dcd1661a10062aeee07.webp

1、只有一个下划线(_)是干嘛的呢?

在 Python 解释器里面,对单个下划线是有特殊的 “感情” 的,我来给你举个例子:


8288cf1f30997360b0ecb405de7e5912.webp




仔细看你会发现,_ 是有值的,这是因为在 Python 解释器里面, _ 会指向你最后一次执行的表达式。这在我们使用 Python 交互的时候常常会用到。

除此之外,我们还可以使用单个下划线来格式化变量的值,比如金额:


2816d763d183a5088ce87ab9f9dd70e8.webp




通过这样的表现,我们能更加易读, Python 也知道我们在表示什么。

再者,单个下划线还可以使用在循环语句中:


a6f4c59cab11ca4b97bc41a5643484f9.webp




2、你常见的 __xx__

这种以两个下划线开头和结尾的命名方式,我想应该是你最常见到的了,比如我们之前说的类的初始化方法:


e55f370f8cf3bb35386d2cadaeeb73a1.webp




其实这些,我们叫它们为 “魔法函数” ,也就是说,它是 Python 内置好了的,我们可以直接拿来使用。所以你应该尽量避免做这样类似的以两个下划线开头和结尾的方式去命名。

3、单个下划线开头的 _xx

以单个下划线开头命名的方法或者变量,就是说明它是仅提供内部使用的。

举一个例子,我们来创建一个模块(handsomeb.py),然后在里面创建两个方法,一个以单个下划线开头命名,一个不以单个下划线开头命名:


578fe1c6dccafa8a49603a0b89a174bb.webp




接着我们去引用这个模块,分别执行模块中的方法:


515be885dc7f1013ca4e09a1421d3cd2.webp




当我们去执行 my_func() 输出 fxxkpython ,没毛病吧:


9833ea7a9a15ec01ae8319775a72f042.webp




但是当我们去执行 _my_func() 的时候就不行了:


dbb28714cd06daec524b8ab5ae7b5913.webp




这时候它告诉我们 _my_func 没有定义,它只能被模块内部使用。

4、单个下划线结尾的 xx_

我们知道, Python 有许多关键词,比如 def、return、calss、pass 这些,它们都是有特殊的意义的,所以我们在定义变量或者方法的时候,不可以用它们来命名的,比如这样是错误的:


99a19ed9378488ed8132d40acb7e84bd.webp




那么如果我们死都要这样定义名称呢?为了区分,在它们的后面添加一个下划线:


faecb1efd1d3e8bef5661f20d8716350.webp




但是小帅b不建议这样命名,有那么多名称,何必去定义关键词相关的名称呢。

5、两个下划线开头的命名: __xx
这种命名的方式更多的是用在类的继承,通过两个下划线开头命名的成员,可以防止被子类重写。
我们来写一个这样的 Person 类:


a7b6993e7fc7e6c370619815e6f6fdb5.webp



可以看到,在 Person 这个类里面,有两个变量,一个是 name ,一个是 age。不过 age 是以两个下划线开头命名了。
当我们去实例化这个 Person 的时候,发现 name 可以正常访问,但是 __age 无法访问了。
我们来打印一下这个对象的属性:


b2bb5eb29191d23e6be2f9f82f3b3091.webp



仔细看,name 还是 name, 但是 __age 变成了 _Person__age。
所以我们无法重写原来的 __age:


0372adf8360daf2c5ff73b71907d828c.webp



我们来打印一下这个 Son 类的属性:


65615419ea82ff4258ac785f0d0aee05.webp



可以发现,son 里面的 __age 实质上已经变成了 _Son__age。所以你要得到真正重写的值可以这样:


dfa30be2b85fba84acd12de30440023b.webp



6、一个下划线+类名+两个下划线开头的命名: _classname__xx
通过上面第 5 点的解释,那么还有这么一种命名方式应该对你来说就好理解了:


661c243bad7b46c4a77fb85b97e711a8.webp



你可以这样去使用它:


c6c1c685c7e45798dccea2804df99054.webp



ok,以上就是 Python 中各种下划线的用法和解释,希望对你有帮助,如果你看一遍之后有点懵,那就再看几遍吧。当你把别人忽略的东西掌握起来,你就比他们牛逼了。
ps: 如果你对 Python 这些骚操作感兴趣,不妨了解一下小帅b的私密干货:帅帅的 vip ,以上这一篇只是其中的一小篇 “甜点”,那么我们下回见咯,peace!
相关:Python 被低估了的 10 个小技巧
Pycharm 被低估了的 10 个快捷键
这几个 Pycharm 插件能让你撸代码撸到高潮


让我知道
你正在看
浏览 26
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报