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中的条件判断语句
May 14 Python
各个系统下的Python解释器相关安装方法
Oct 12 Python
pyqt5自定义信号实例解析
Jan 31 Python
Python模块WSGI使用详解
Feb 02 Python
纯用NumPy实现神经网络的示例代码
Oct 24 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
Python如何访问字符串中的值
Feb 09 Python
详解python logging日志传输
Jul 01 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 Python
python用tkinter开发的扫雷游戏
Jun 01 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
php执行sql语句的写法
2009/03/10 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
详解php反序列化
2020/06/10 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
python分布式环境下的限流器的示例
2017/10/26 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
Python中安装easy_install的方法
2018/11/18 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
资产评估专业学生的自我鉴定
2013/11/14 职场文书
英语商务邀请函范文
2014/01/16 职场文书
个人承诺书格式
2014/06/03 职场文书
学前教育见习总结
2015/06/23 职场文书
有关西游记的读书笔记
2015/06/25 职场文书
高三物理教学反思
2016/02/20 职场文书