本文将介绍_字符在Python中的不同用法。与Python中的许多其他事物一样,我们将看到的“_”的不同用法主要是约定俗成的问题。这里我们将介绍五种不同的情况:单下划线(例如_)名称前面有一个下划线(例如_total)名称后面有一个下划线(例如total_)数字文字中的单下划线(例如100_000)名称前面有一个双下划线(e.g.__total)name前后双下划线(e.g.__init__)1.单下划线(_)单下划线(_)单下划线通常用于3种情况:1.在parser中_name指向一个interactiveinterpretersession,和finally执行语句的结果。这首先由标准CPython解释器完成,其他解析器紧随其后。>>>_Traceback(mostrecentcallast):File"",line1,inNameError:name'_'isnotdefined>>>42>>>_42>>>'好吧!'if_else':(''alright!'>>>_'alright!'2.作为名字这个和前面一点有点关系,_作为一次性名字,这是为了让读代码的人知道一个名字是此处赋值,但并不打算使用。例如,你可能对循环计数器的实际值不感兴趣:n=42for_inrange(n):do_something()3.i18n我们可以看到_也可以usedasafunction.在这种情况下,它通常用于执行国际化和本地化字符串转换查找的函数的名称。这似乎是从C语言派生并遵循的规则。如Django文档中所示:fromdjango.httpimportHttpResponsefromdjango.utils.translationimportgettextas_defmy_view(request):output=_("Welcomometomysite.")returnHttpResponse(output)第二种和第三种用法可能会冲突,因此,在任何情况下都应避免使用_作为一个-time-usename在两个代码块中使用_进行i18n查找和翻译。2.在名称前加单下划线(如_total)在名称前加单下划线用于指定程序员将该名称视为“私有”。这可以看作是一种约定,以便阅读代码的人知道以_开头的名称供内部使用。正如Python文档所述:带下划线的名称(例如_spam)应被视为API的非公共部分(无论是函数、方法还是数据成员)。它应被视为实施细节,如有更改,恕不另行通知。*是一个约定,因为它实际上对解析器有一些意义;如果我们从import*导入*,以_开头的导入将不会被导入,除非它们明确包含在模块/包的__all__列表中。名字的开头。3.名称后单下划线(如total_)名称后单下划线用于防止一个名称覆盖另一个名称,当然是一种约定。例如,如果要命名某种格式,为了避免盖过Python的内置格式,可以将其命名为format_。4.数字文字中的单下划线(例如100_000)PEP515索引建议扩展Python的语法,以便下划线可以用作视觉分隔符,用于对整数、浮点数和复杂数字文字中的数字进行分组,推理:这是另一个现代A语言的共同特征可以帮助提高较长文字或文本的可读性,其值应清楚地分成多个部分,例如十六进制表示法中的字节或单词。所以我们可以这样做:#Decimalnumbersgroupedbythousandamount=10_000_000.0#Grouphexaddressesbywordaddr=0xCAFE_F00D#Groupbitsintonibbleswithbinaryliteralsflags=0b_0011_1111_0100_1110#同样,用于字符串转换flags=int('0b_1111_0000',2)5.名称前双下划线(如__total)在名称(尤其是方法名)前使用双下划线(__)不是约定俗成,但对于解析器来说有特殊意义。Python管理这些名称,它使用这些名称来避免与子类定义的名称发生名称冲突。正如Python文档所述,任何__spam形式的标识符(至少两个前导下划线,至多一个尾随下划线)在文本上被_classname__spam替换,其中classname是当前类名,前导下划线被剥离。举个例子:>>>classA(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的>>>classB(A):...def__method_name(self):...pass..>>>dir(B())['_A__method_name','_B__method_name',...,'_internal_use']这里的预期行为几乎等同于Java中的最终方法和C++中的常规(非虚拟)方法方法。6.在名称前后加上双下划线(例如__init__)这些是Python使用的特殊方法名称。对我们来说,这只是一种约定,Python系统使用与用户定义的名称不冲突的名称的一种方式。然后,我们通常会覆盖这些方法并定义Python调用它们所需的行为。比如写一个类的时候,重写了__init__方法。没有什么能阻止我们编写自己的特殊方法名称(但最好不要这样做):>>>classC(object):...def__mine__(self):...pass...>>>dir(C)...[...,'__mine__',...]尽量不要使用这种命名方式,让Python定义的特殊名称遵循这种约定即可。