Python中下划线的使用方法

本文将讨论Python中下划线(_)字符的使用方法。我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已。

单下划线(_)

通常情况下,会在以下3种场景中使用:

1、在解释器中:在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果。这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用。

?


1

2

3

4

5

6

7

8

9

10

>>> _ Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ‘_‘ is not defined

>>> 42

>>> _

42

>>> ‘alright!‘ if _ else ‘:(‘

‘alright!‘

>>> _

‘alright!‘

2、作为一个名称:这与上面一点稍微有些联系,此时“_”作为临时性的名称使用。这样,当其他人阅读你的代码时将会知道,你分配了一个特定的名称,但是并不会在后面再次用到该名称。例如,下面的例子中,你可能对循环计数中的实际值并不感兴趣,此时就可以使用“_”。

?


1

2

3

n = 42

for _ in range(n):

 do_something()

3、国际化:也许你也曾看到”_“会被作为一个函数来使用。这种情况下,它通常用于实现国际化和本地化字符串之间翻译查找的函数名称,这似乎源自并遵循相应的C约定。例如,在Django文档“转换”章节中,你将能看到如下代码:

?


1

2

3

4

5

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”是去掉前导下划线的当前类名。例如下面的例子:

?


1

2

3

4

5

6

7

8

>>> 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”。

?


1

2

3

4

5

6

>>> 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__”方法。

虽然你也可以编写自己的特殊方法名,但不要这样做。

?


1

2

3

4

5

6

>>> class C(object):

... def __mine__(self):

... pass

...

>>> dir(C)

... [..., ‘__mine__‘, ...]

其实,很容易摆脱这种类型的命名,而只让Python内部定义的特殊名称遵循这种约定。

时间: 2024-10-07 03:06:21

Python中下划线的使用方法的相关文章

Python中下划线---完全解读

Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始. 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始.一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用.当变量是私有的时候,用_xxx 来表示变量是很好的习惯.因为变量名

00.Python中下划线的5种含义

转自这里 先放上 简短的"速查表",罗列了五种Python下划线模式的含义: 模式 举例 含义 单前导下划线 _var 命名约定,仅供内部使用.通常不会由Python解释器强行执行(通配符导入除外),只作为对程序员的提示. 单末尾下划线 var_ 按约定使用以避免与Python关键字的命名冲突 双前导下划线 __var 当在类上下文中使用时,触发"名称修饰".由Python解释器强行执行. 双前导和末尾下划线 __var__ 表示Python语言定义的特殊方法.避免

[转]Python中下划线以及命名空间的意义

Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public    2. __object__ # special, python system use, user should not define like it    3. __object # private (name mangling during runtime)    4. _object # obey  coding convention, consider it a

python中下划线_的用途

Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx       不能用'from module import *'导入 __xxx__  系统定义名字 __xxx     类中的私有变量名 核心风格:避免用下划线作为变量名的开头. 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开头.一般来讲,变量名_xxx被看作是"私有的",在模块或类外不可以使用.当变量是私有的时候,用_xxx 来表示变量是很好的习惯. 因为变量名_

Python 中下划线

1. 作为一个名称:在代码中使用一个名称,但是在后面的代码中不再会使用到的时候,就可以使用_作为临时名称. n = 42 for _ in range(n): do_something() 2. 名称前的单下划线:类似于"私有",不能通过import 导入 3. 名称前的双下划线:对解释器来说有特殊意义,在解释执行的时候,会解释为"_classname__name",也就是在名称前面加上"_类名",这样做的目的是不和子类中的同名变量/方法冲突,也

Python下划线的使用

References: [1]. http://python.jobbole.com/81129/ 本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情况下,会在以下3种场景中使用: 1.在解释器中:在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用. Python 1 2 3 4 5 6

转载:浅谈 Scala 中下划线的用途

Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就来总结下 Scala 中下划线的用法. 1.存在性类型:Existential types def foo(l: List[Option[_]]) = ... 2.高阶类型参数:Higher kinded type parameters case class A[K[_],T](a: K[T]) 3

【python初级】010-构造方法,属性和迭代器

构造方法,属性和迭代器 目录: -------------构造方法 1.构造方法的基本使用 2.重写一般方法和特殊的构造方法 3.绑定的超类构造方法 4.调用为绑定的超类来构造方法 5.使用super函数 6.成员访问 7.基本的序列和映射规则 8.子类化列表,字典和字符串 -------------属性 -------------迭代器 一:构造方法 在python的心版本中,会有一些特性(比如属性和super函数)不会再老式的类上起作用,为了确保使用的类是新型的,应该把赋值语句metacla

Python学习笔记之魔法方法

魔法方法(特殊方法):名称以双下划线和双下划线结尾的方法. 这些方法会在特殊情况下被Python直接调用,几乎没有直接调用的必要. __init__():构造函数 __del__():析构函数 在其他语言中对象可能被要求属于某一个类,或被要求实现接口,但在Python中只是简单的要求它遵守几个给定的规则. 如一个序列类,为了实现规则,则需要实现以下魔法方法: __len__(self):返回集合中所含项目的数量 __getitem__(self,key):返回与所给键对应的值 __setitem