python 下划线的不同用法

作者:为AI呐喊 时间:2021-01-20 16:55:13 

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

  1. 单下划线(例如 _)

  2. 名称前加一个下划线(例如 _total)

  3. 名称后加一个下划线(例如 total_)

  4. 数字文字中的单个下划线(例如 100_000)

  5. 名称前加上双下划线(例如 __total)

  6. 名称前后加双下划线(例如 __init__)

一.单下划线(_)

单下划线通常在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.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 的


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

来源:https://developer.51cto.com/art/202010/629593.htm

标签:python,下划线
0
投稿

猜你喜欢

  • Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色

    2021-12-03 04:04:53
  • Python 多线程的实例详解

    2023-09-24 23:15:04
  • Python内存泄漏和内存溢出的解决方案

    2022-02-10 11:46:55
  • python实现简单购物商城

    2022-01-23 06:47:39
  • Python爬虫框架Scrapy常用命令总结

    2022-02-21 20:45:23
  • 贝聿铭写给年轻设计师的十点忠告

    2010-01-24 18:46:00
  • python 输入字符串生成所有有效的IP地址(LeetCode 93号题)

    2022-09-06 00:16:57
  • pytorch plt.savefig()的用法及保存路径

    2021-04-28 12:55:44
  • python+opencv打开摄像头,保存视频、拍照功能的实现方法

    2021-06-12 15:16:02
  • vue3中使用ref和emit来减少props的使用示例详解

    2024-04-27 16:02:02
  • PHP封装的数据库模型Model类完整示例【基于PDO】

    2023-11-15 21:06:42
  • Python接口测试环境搭建过程详解

    2021-08-31 16:12:52
  • 中秋送礼分配不均这款python刮刮卡完美解决问题

    2023-01-03 11:28:38
  • Python新手入门之解释器的安装

    2023-02-14 15:41:52
  • vue实现父子组件之间的通信以及兄弟组件的通信功能示例

    2024-05-21 10:15:43
  • 带你学习MySQL执行计划

    2024-01-18 12:34:37
  • python moviepy 的用法入门篇

    2022-09-03 11:41:16
  • python数据库编程 ODBC方式实现通讯录

    2024-01-15 10:58:01
  • Python数据分析之 Pandas Dataframe修改和删除及查询操作

    2023-08-03 23:01:13
  • Python Mock模块原理及使用方法详解

    2023-03-31 14:13:56
  • asp之家 网络编程 m.aspxhome.com