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 15 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
Jun 12 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
Django认证系统user对象实现过程解析
Mar 02 Python
python 数据分析实现长宽格式的转换
May 18 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
python中xlrd模块的使用详解
Feb 01 Python
Python实现位图分割的效果
Nov 20 Python
详解Python内置模块Collections
Mar 22 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和MySql来与ODBC数据连接
2006/10/09 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
自动更新作用
2006/10/08 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
Python列表与元组的异同详解
2019/07/02 Python
Python对wav文件的重采样实例
2020/02/25 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
用python写爬虫简单吗
2020/07/28 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
生物制药专业求职信
2014/03/11 职场文书
机械专业求职信范文
2014/07/15 职场文书
导航工程专业自荐信
2014/09/02 职场文书
五四演讲稿范文
2014/09/03 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技