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 不关闭控制台的实现方法
Oct 23 Python
python使用正则表达式匹配字符串开头并打印示例
Jan 11 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
python查询mysql,返回json的实例
Mar 26 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
使用python客户端访问impala的操作方式
Mar 28 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
python不同系统中打开方法
Jun 23 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魔术方法__GET、__SET使用实例
2014/11/25 PHP
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
解释&&和||在javascript中的另类用法
2014/07/28 Javascript
js查找节点的方法小结
2015/01/13 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
整理Python中的赋值运算符
2015/05/13 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
Django内容增加富文本功能的实例
2017/10/17 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Python中字符串与编码示例代码
2019/05/20 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
酒吧总经理岗位职责
2013/12/10 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android