python 下划线的不同用法


Posted in Python onOctober 24, 2020

在本文中,我们将介绍 Python 中 _ 字符的不同用法。就像 Python 中的许多其他内容一样,我们会看到 “_” 的不同用法主要是惯例问题。这里我们将介绍的几种不同情况:

  1. 单下划线(例如 _)
  2. 名称前加一个下划线(例如 _total)
  3. 名称后加一个下划线(例如 total_)
  4. 数字文字中的单个下划线(例如 100_000)
  5. 名称前加上双下划线(例如 __total)
  6. 名称前后加双下划线(例如 __init__)

一.单下划线(_)

单下划线通常在3种情况下使用:

1.在解析程序中

_名称指向交互式解释器会话中,最后执行的语句结果。这首先是由标准CPython解释器完成的,其他解析器也紧随其后。

>>> _ 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
NameError: name '_' is not defined 
>>> 42 
>>> _ 
42 
>>> 'alright!' if _ else ':(' 
'alright!' 
>>> _ 
'alright!' 

2.作为名称

这与上一点有些关联,_ 用作一次性的名称。这为了让阅读代码的人知道,这里分配了某个名称,但是不打算使用。例如,你可能对循环计数器的实际值不感兴趣:

n = 42 
for _ in range(n): 
    do_something() 

3.i18n

我们可以看到 _ 还可以用作函数。在这种情况下,它通常用于执行国际化和本地化字符串转换查找的函数的名称。这似乎源于并遵循 C 语言的相关规则。如在Django文档中所见:

from django.http import HttpResponse 
from django.utils.translation import gettext as _ 
 
def my_view(request): 
    output = _("Welcome to my site.") 
    return HttpResponse(output) 

第二个和第三个用法可能会发生冲突,因此,在任何还将 _ 用作 i18n 查找和翻译的代码块中,都应避免使用 _ 作为一次性使用的名称。

二.名称前加单下划线(例如_total)

名称前的单个下划线用于指定程序员将名称视为“私有”。这可以视为一种约定,方便阅读代码的人知道以 _ 开头的名称供内部使用。 正如Python文档所述:

带有下划线的名称(例如 _spam)应被视为 API 的非公开部分(无论是函数、方法还是数据成员)。它应被视为实现细节,如有更改,恕不另行通知。
*之所以说是一种约定,是因为它实际上对解析程序而言有着某种意义;如果我们从 import *,除非以模块/软件包的 __all__ 列表明确包含它们,否则不会导入以 _ 开头的名称。

三. 名称后的单下划线(例如 total_)

名称后面的单个下划线用于避免名称遮盖另一个名称,当然是惯例。例如,如果你想命名某种格式,为了避免掩盖 Python 的内置格式,你可以将其命名为 format_。

四. 数字字面中的单下划线(例如 100_000)

PEP 515 指数建议扩展 Python 的语法,以便下划线可以用作整体、浮点和复杂数字文本中数字分组的可视分隔符,理由是:

这是其他现代语言的常见特征,可以帮助提高较长的文字或文本的可读性,其值应清楚地分隔成部分,如字节或十六进制表示法中的单词。

因此,我们可以执行以下操作::

# 十进制数按千分组 
amount = 10_000_000.0 
 
# 按字对十六进制地址进行分组 
addr = 0xCAFE_F00D 
 
# 用二进制文字将位分组为半字节 
flags = 0b_0011_1111_0100_1110 
 
#相同,用于字符串转换 
flags = int('0b_1111_0000', 2) 

五. 姓名前的双下划线(例如__total)

在名称(特别是方法名称)前使用双下划线(__)不是约定,只是对解析程序有特殊的意义。Python 管理这些名称,它用于避免名称与子类定义的名称冲突。正如Python文档所指出的那样,任何形式为__spam 的标识符(至少两个前导下划线,并且最多一个尾随下划线)在文本上均被 _classname__spam替换,其中 classname 是当前类名,其中前导下划线被去除。

以以下示例为例:

>>> class A(object): 
...     def _internal_use(self): 
...         pass 
...     def __method_name(self): 
...         pass 
...  
>>> dir(A()) 
['_A__method_name', ..., '_internal_use'] 

如上所示,_internal_use 不变,但是 __method_name 被改成 _ClassName__method_name。 现在,如果你创建 A 的子类,比如说 B(坏、坏名字),那么你将无法轻易覆盖 A 的

>>> class B(A): 
...     def __method_name(self): 
...         pass 
...  
>>> dir(B()) 
['_A__method_name', '_B__method_name', ..., '_internal_use'] 

这里的预期行为几乎等同于Java中的最终方法和C ++中的常规(非虚拟)方法。

六. 在名称之前和之后加上双下划线(例如__init__)

这些是 Python 使用的特殊方法名称。对于我们来说,这只是一个约定,即 Python 系统使用与用户定义的名称不冲突的名称的一种方式。然后,我们通常会覆盖这些方法并为 Python 调用它们时定义所需的行为。例如,在编写类时__init__重写方法。

没有什么可以阻止我们编写自己的特殊方法名称(但是最好别这么做):

>>> class C(object): 
...     def __mine__(self): 
...         pass 
... 
>>> dir(C) 
... [..., '__mine__', ...] 

尽量不要使用这种命名方式,只需要让Python定义的特殊名称遵循该约定即可。

以上就是python 各种下划线的作用的详细内容,更多关于python 下划线的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现自动登录人人网并采集信息的方法
Jun 28 Python
在CMD命令行中运行python脚本的方法
May 12 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
Jul 06 Python
python selenium循环登陆网站的实现
Nov 04 Python
python3中rank函数的用法
Nov 27 Python
python实现126邮箱发送邮件
May 20 Python
python神经网络编程实现手写数字识别
May 27 Python
学python需要去培训机构吗
Jul 01 Python
Python pandas对excel的操作实现示例
Jul 21 Python
Python如何读写字节数据
Aug 05 Python
python 写一个性能测试工具(一)
Oct 24 #Python
Django admin组件的使用
Oct 24 #Python
Python数据可视化常用4大绘图库原理详解
Oct 23 #Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 #Python
python 带时区的日期格式化操作
Oct 23 #Python
Python可视化工具如何实现动态图表
Oct 23 #Python
python 匿名函数与三元运算学习笔记
Oct 23 #Python
You might like
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
认识延迟时间为0的setTimeout
2008/05/16 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
详解React项目中碰到的IE问题
2019/03/14 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
python的变量与赋值详细分析
2017/11/08 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
购房协议书范本
2014/04/11 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫