Python中的下划线详解

 更新时间:2015年06月24日 12:09:34   投稿:junjie  
这篇文章主要介绍了Python中的下划线详解,本文讲解了单个下划线直接做变量名、单下划线前缀的名称、双下划线前缀的名称等内容,需要的朋友可以参考下

这篇文章讨论Python中下划线_的使用。跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定。

一、 单个下划线直接做变量名(_)

主要有三种情况:

1. 解释器中

_符号是指交互解释器中最后一次执行语句的返回结果。这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了。

复制代码 代码如下:

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

2. 作为名称使用

这个跟上面有点类似。_用作被丢弃的名称。按照惯例,这样做可以让阅读你代码的人知道,这是个不会被使用的特定名称。举个例子,你可能无所谓一个循环计数的值:

复制代码 代码如下:

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

3. i18n

_还可以被用作函数名。这种情况,单下划线经常被用作国际化和本地化字符串翻译查询的函数名。这种惯例好像起源于C语言。举个例子,在 Django documentation for translation 中你可能会看到:

复制代码 代码如下:

from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)


第二种和第三种用法会引起冲突,所以在任意代码块中,如果使用了_作i18n翻译查询函数,就应该避免再用作被丢弃的变量名。

二、 单下划线前缀的名称(例如_shahriar)
以单下划线做前缀的名称指定了这个名称是“私有的”。在 有些 导入import * 的场景中,下一个使用你代码的人(或者你本人)会明白这个名称仅内部使用。Python documentation里面写道:

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.

之所以说在在 有些 import * 的场景,是因为导入时解释器确实对单下划线开头的名称做了处理。如果你这么写from <module/package> import *,任何以单下划线开头的名称都不会被导入,除非模块/包的__all__列表明确包含了这些名称。更多相关信息见““Importing * in Python”。

三、双下划线前缀的名称(例如__shahriar)

以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Python documentation中提到,任何__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 C(object):
...     def __mine__(self):
...         pass
...
>>> dir(C)
... [..., '__mine__', ...]

还是不要这样写方法名,只让Python定义的特殊方法名使用这种惯例吧。

相关文章

  • 几个关于python  Pdf 技巧的分享

    几个关于python  Pdf 技巧的分享

    这篇文章主要介绍了python使用技巧Pdf的详细内容,PyPDF2是一个纯Python的开源库,能够分割或合并PDF文件,也可以裁剪或转换PDF文件中的页面,下面关于文章主题内容将详细介绍,需要的小伙伴可以参考一下
    2022-02-02
  • Python实战之基于OpenCV的美颜挂件制作

    Python实战之基于OpenCV的美颜挂件制作

    在本文中,我们将学习如何创建有趣的基于Snapchat的增强现实,主要包括两个实战项目:在检测到的人脸上的鼻子和嘴巴之间添加胡子挂件,在检测到的人脸上添加眼镜挂件。感兴趣的童鞋可以看看哦
    2021-11-11
  • python数据库编程 Mysql实现通讯录

    python数据库编程 Mysql实现通讯录

    这篇文章主要为大家详细介绍了python数据库编程,Mysql实现通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • python open读取文件内容时的mode模式解析

    python open读取文件内容时的mode模式解析

    这篇文章主要介绍了python open读取文件内容时的mode模式解析,Python可以使用open函数来实现文件的打开,关闭,读写操作,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • YOLOv5小目标切图检测的思路与方法

    YOLOv5小目标切图检测的思路与方法

    目标检测Yolo算法是非常经典且应用广泛的算法,下面这篇文章主要给大家介绍了关于YOLOv5小目标切图检测的思路与方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Python快速实现一个线程池的示例代码

    Python快速实现一个线程池的示例代码

    当有多个 IO 密集型的任务要被处理时,我们自然而然会想到多线程。而线程池的实现也很简单,因为 Python 提供了一个标准库 concurrent.futures,已经内置了对线程池的支持。所以本篇文章,我们就来详细介绍一下该模块的用法
    2022-07-07
  • 为什么黑客都用python(123个黑客必备的Python工具)

    为什么黑客都用python(123个黑客必备的Python工具)

    python支持功能强大的黑客攻击模块,而且Python提供多种库,用于支持黑客攻击,Python提供了ctypes库, 借助它, 黑客可以访问Windows、OS X、Linux等系统提供 DLL与共享库,还有Python语言易学易用,这对黑客攻击而言是个巨大的优势。
    2020-01-01
  • Python中logger模块的使用场景分析

    Python中logger模块的使用场景分析

    logger是python的内置模块,用以输出代码运行过程中的运行情况,极大的方便了我们的debug过程,本文通过实例代码给大家介绍了Python中logger模块的使用教程,需要的朋友可以参考下
    2023-06-06
  • Python字符串对齐、删除字符串不需要的内容以及格式化打印字符

    Python字符串对齐、删除字符串不需要的内容以及格式化打印字符

    这篇文章主要给大家介绍了关于Python字符串对齐、删除字符串不需要的内容以及格式化打印字符的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • jupyter默认工作目录的更改方法

    jupyter默认工作目录的更改方法

    jupyter notebook是一个以网页形式来使用的python编辑器,很多小伙伴在第一次安装它的时候选择的都是默认安装,那么jupyter默认工作目录如何更改,本文就来介绍一下
    2023-08-08

最新评论