百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

为什么Python中有各种各样的“_”下划线?分别有什么用?

liuian 2025-03-01 14:37 36 浏览

刚开始学Python的你一定很疑惑,为什么Python里会出现各种各样的下划线 “_”,而且位置都不相同,有时候在名称后面,有时候在前面,有时候还会在数字中间......这些下划线都分别代表了什么意思?本文就给大家普及普及。

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

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

一.单下划线(_)

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

1.在解析程序中

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

>>> _
Traceback (most recent call last):
  File "", line 1, in 
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 的__method_name

>>> 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定义的特殊名称遵循该约定即可。


参考链接:

Django官方文档:
https://docs.djangoproject.com/en/dev/topics/i18n/translation/

Python官方文档:
https://docs.python.org/3/tutorial/classes.html#private-variables

PEP515:https://www.python.org/dev/peps/pep-0515/


--END--

以上为本文所有内容,希望能帮助各位Python爱好者答疑解惑!

希望本文的同学,记得点赞哈~也可以关注我们!

相关推荐

青果教务网络管理系统(青果教务系统官方网站)

青果是教务系统。是湖南青果软件有限公司打造的教育教学管理系统。教务系统管理平台充分利用互联网络B/S管理系统模式,以网络为平台,为各个学校教务系统的管理提供一个平台,帮助学校管理教务系统,用一个帐号解...

好看的系统小说推荐(好看的系统类完本小说)

穿越之大神养成系统重生之少年成名任务《重生成神》秀爷的星级之旅重生成智能系统重生成系统星际婚恋之炙受可热万古武尊超级幻想兑换系统全能奇才、末世之兑换高手、穿越之兑换无敌、:重生之我能升级...

怎么设置开机启动程序(怎么设置开机启动程序快捷键)

要设置电脑开机启动程序,可以通过以下步骤:首先,按下Win+R组合键打开运行窗口,输入“shell:startup”打开启动文件夹。然后,将想要开机启动的程序或快捷方式复制到启动文件夹中即可。如果要禁...

一键pe工具箱(pe工具箱教程)

微pe家庭版本。微pe家庭版本是一款简单易用的软件,它可以帮助用户快速安装系统,而且拥有简单的界面,使用起来十分方便。它可以帮助用户安装的操作系统,还可以协助用户备份和还原系统,让用户安装更新系统变...

使用下面的ip地址怎么设置(使用下面的ip地址是什么地址)

1、鼠标点击电脑桌面右下角小电脑图标,在弹出的对话框中,点击打开网络和共享中心。2、弹出网络和共享中心的界面,点击更改适配器设置3、找到本地连接,右键点击并选择属性。4、弹出窗口后,点击...

破解wifi密码并显示密码(破解wifi显示密码最强的软件是什么)

有以下两种方法:一、复位无线路由器1.破译无线网络密码的最简单办法就是复位路由器,但是复位的具体方法要根据大家使用路由器的品牌来决定,不同的牌子复位途径都不一样。大家可以上网查自己路由器的型号,然后进...

office2010永久密钥激活码(office2010永久激活版)

用这个试试,一个KMS激活工具可以激活2010到2019的Office自家的目前用的就是这个microsoft6477.moe/1716.html...

win10重装 无法更新启动配置

第一种:通过运行scanreg/restore来恢复注册表,或运行scanreg/fix来修复注册表。不过该命令应该在DOS下执行。对于win98系统,开机时按F8,选择CommandProm...

win7电脑安全模式怎么退出(win7进入安全模式后如何退出)
  • win7电脑安全模式怎么退出(win7进入安全模式后如何退出)
  • win7电脑安全模式怎么退出(win7进入安全模式后如何退出)
  • win7电脑安全模式怎么退出(win7进入安全模式后如何退出)
  • win7电脑安全模式怎么退出(win7进入安全模式后如何退出)
windows8之家(windows8.)

1,右击“计算机”,从弹出的菜单中选择“属性”项。2,然后就可以要窗口最下面“Windows激活”栏看到Win8的激活的状态.3,当Win8处于未激活状态时,可以通过两种方式:1),输入产品密钥的方式...

纯净版u盘pe系统(u盘纯净版系统安装教程)

如何制作官方纯净版Windows10PE启动U盘?你下载一个:老毛桃优盘启动工具,然后把一个空的优盘插进去就可以制作一个带启动的优盘了。然后把GHO文件放进去即可。软碟通做起动盘,做盘时注意模式,有h...

手机免费解压软件(手机免费解压软件7-ZIP下载)
手机免费解压软件(手机免费解压软件7-ZIP下载)

步骤/方式1当你下载压缩文件时,任务列表右侧会出现“下载完成后解压”按钮。步骤/方式2点击按钮后,你可以选择解压到哪个目录,解压成功后是否打开文件夹。步骤/方式3最后点击“确定”就能让这个压缩文件在下载完成后的第一时间开始解压缩。...

2025-12-17 11:55 liuian

电脑c盘满了怎么解决(电脑c盘满了咋整)

如果你的电脑是因为装系统时给C盘分配容量太小而导致C盘装满,可以用系统自带的磁盘管理工具就可以解决,操作步骤如下:点击此电脑-管理-存储-磁盘管理。右键点你要压缩的磁盘,再选择压缩卷,输入相应的容量,...

华硕电脑重装系统怎么操作(华硕电脑重装win10系统步骤)
华硕电脑重装系统怎么操作(华硕电脑重装win10系统步骤)

准备好一张系统安装光盘,并通过系统盘安装系统,具体步骤如下:1.、将系统光盘放入光驱中去;2.、重启电脑,开机点击ESC键后,通过键盘上的方向键选择DVD光驱启动项,并点击回车键进入系统安装界面;3.、出现Windows7安装界面,首先依...

2025-12-17 10:55 liuian

微软官网win10下载专区(微软官网windows10下载)

微软官网下载的win10,只有用正版密钥激活后才是正版的。如果用工具激活就是盗版的。微软操作系统是美国微软开发的Windows系列视窗化操作系统。个人版目前最高版本为Windows11,因为微软的个...