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转换字符串为摩尔斯电码的方法
Jul 06 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
在双python下设置python3为默认的方法
Oct 31 Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
python装饰器使用实例详解
Dec 14 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
Python参数传递及收集机制原理解析
Jun 05 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
Python如何重新加载模块
Jul 29 Python
python自动从arxiv下载paper的示例代码
Dec 05 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网站备份程序代码分享
2011/06/10 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php生成html文件方法总结
2014/12/01 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
javascript的几种写法总结
2016/09/30 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
python实现巡检系统(solaris)示例
2014/04/02 Python
python控制台英汉汉英电子词典
2020/04/23 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
python+mysql实现教务管理系统
2019/02/20 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
酒店副总经理岗位职责范本
2014/02/04 职场文书
工程质量月活动方案
2014/02/19 职场文书
购房协议书范本
2014/04/11 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
赔偿协议书
2015/01/27 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
SQL中的连接查询详解
2022/06/21 SQL Server