Python中的单下划线和双下划线使用场景详解


Posted in Python onSeptember 09, 2019

单下划线

单下划线用作变量

最常见的一种使用场景是作为变量占位符,使用场景明显可以减少代码中多余变量的使用。为了方便理解,_可以看作被丢弃的变量名称,这样做可以让阅读你代码的人知道,这是个不会被使用的变量,e.g.。

for _, _, filenames in os.walk(targetDir):
  print(filenames)
  
for _ in range(100):
  print('PythonPoint')

在交互解释器比如iPython中,_变量指向交互解释器中最后一次执行语句的返回结果。

单下划线前缀名称(例如_pythonPoint)

  • 这表示这是一个保护成员(属性或者方法),只有类对象和子类对象自己能访问到这些变量,是用来指定私有变量和方法的一种方式(约定而已)。如果使用from a_module import *导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用import a_module这样导入模块,仍然可以用a_module._pythonPoint这样的形式访问到这样的对象。
  • 另外单下划线开头还有一种一般不会用到的情况,例如使用一个C编写的扩展库有时会用下划线开头命名,然后使用一个去掉下划线的Python模块进行包装。如struct这个模块实际上是C模块_struct的一个Python包装。

单下划线后缀名称

通常用于和Python关键词区分开来,比如我们需要一个变量叫做class,但class是Python的关键词,就可以以单下划线结尾写作class_

双下划线

双下划线前缀名称

这表示这是一个私有成员(属性或者方法)。它无法直接像公有成员一样随便访问。双下划线开头的命名形式在Python的类成员中使用表示名字改编,即如果Test类里有一成员__x,那么dir(Test)时会看到_Test__x而非__x。这是为了避免该成员的名称与子类中的名称冲突,方便父类和子类中该成员的区分识别。但要注意这要求该名称末尾最多有一个下划线。e.g.

Python中的单下划线和双下划线使用场景详解

双下划线前缀及后缀名称

一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突。是一些Python的“魔术”对象,表示这是一个特殊成员。如类成员的__init____del____add__等,以及全局的__file____name__等。Python官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用Python内置的这些特殊成员。

Python中关于私有属性、方法约定问题,官方文档如下

“Private” instance variables that cannot be accessed except from inside an object don't exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form__spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.

Name mangling is helpful for letting subclasses override methods without breaking intraclass method calls.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用item()方法遍历字典的例子
Aug 26 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
Python简单生成随机数的方法示例
Mar 31 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
python读取图片任意范围区域
Jan 23 Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
Python多线程thread及模块使用实例
Apr 28 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
总结Python使用过程中的bug
Jun 18 Python
python 批量修改 labelImg 生成的xml文件的方法
Sep 09 #Python
Python定时发送天气预报邮件代码实例
Sep 09 #Python
python英语单词测试小程序代码实例
Sep 09 #Python
Python实现TCP通信的示例代码
Sep 09 #Python
Python3使用PySynth制作音乐的方法
Sep 09 #Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 #Python
python 的 openpyxl模块 读取 Excel文件的方法
Sep 09 #Python
You might like
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
js代码实现微博导航栏
2015/07/30 PHP
php制作简单模版引擎
2016/04/07 PHP
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
django如何自己创建一个中间件
2019/07/24 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
两道JAVA笔试题
2016/09/14 面试题
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
电视购物广告词
2014/03/19 职场文书
就业协议书的作用
2014/04/11 职场文书
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis