Python中下划线的使用方法


Posted in Python onMarch 27, 2015

本文将讨论Python中下划线(_)字符的使用方法。我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已。

单下划线(_)

通常情况下,会在以下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、国际化:也许你也曾看到”_“会被作为一个函数来使用。这种情况下,它通常用于实现国际化和本地化字符串之间翻译查找的函数名称,这似乎源自并遵循相应的C约定。例如,在Django文档“转换”章节中,你将能看到如下代码:

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

可以发现,场景二和场景三中的使用方法可能会相互冲突,所以我们需要避免在使用“_”作为国际化查找转换功能的代码块中同时使用“_”作为临时名称。

名称前的单下划线(如:_shahriar)

程序员使用名称前的单下划线,用于指定该名称属性为“私有”。这有点类似于惯例,为了使其他人(或你自己)使用这些代码时将会知道以“_”开头的名称只供内部使用。正如Python文档中所述:

以下划线“_”为前缀的名称(如_spam)应该被视为API中非公开的部分(不管是函数、方法还是数据成员)。此时,应该将它们看作是一种实现细节,在修改它们时无需对外部通知。

正如上面所说,这确实类似一种惯例,因为它对解释器来说确实有一定的意义,如果你写了代码“from <模块/包名> import *”,那么以“_”开头的名称都不会被导入,除非模块或包中的“__all__”列表显式地包含了它们。了解更多请查看“Importing * in Python”。

名称前的双下划线(如:__shahriar)

名称(具体为一个方法名)前双下划线(__)的用法并不是一种惯例,对解释器来说它有特定的意义。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中的方法“__method_name”。
 

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

这里的功能几乎和Java中的final方法和C++类中标准方法(非虚方法)一样。

名称前后的双下划线(如:__init__)

这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。

虽然你也可以编写自己的特殊方法名,但不要这样做。
 

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

其实,很容易摆脱这种类型的命名,而只让Python内部定义的特殊名称遵循这种约定。

Python 相关文章推荐
python发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
Python中with及contextlib的用法详解
Jun 08 Python
python实现在pandas.DataFrame添加一行
Apr 04 Python
python调用动态链接库的基本过程详解
Jun 19 Python
python3.7 的新特性详解
Jul 25 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 Python
利用Python脚本实现自动刷网课
Feb 03 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
pandas的resample重采样的使用
Apr 24 Python
Python实现列表索引批量删除的5种方法
Nov 16 Python
Python页面加载的等待方式总结
Feb 28 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 #Python
python根据出生年份简单计算生肖的方法
Mar 27 #Python
python实现根据月份和日期得到星座的方法
Mar 27 #Python
python根据给定文件返回文件名和扩展名的方法
Mar 27 #Python
python中使用mysql数据库详细介绍
Mar 27 #Python
python获得两个数组交集、并集、差集的方法
Mar 27 #Python
Flask入门教程实例:搭建一个静态博客
Mar 27 #Python
You might like
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
python3写爬取B站视频弹幕功能
2017/12/22 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
python 列表推导式使用详解
2019/08/29 Python
在python shell中运行python文件的实现
2019/12/21 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
业务员岗位职责范本
2013/12/15 职场文书
英文推荐信格式范文
2014/05/09 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript