Python学习之路(40)——详解Python的下划线

单下划线(_)

单下划线有三种用法:

1、在解释器中:

在这种情况下,"_"代表交互解释器会话中上一条执行的语句结果。

>>> a = 100
>>> a
100
>>> _
100

2、作为一个名称:

在这种情况下,"_"作为一个临时名称。

>>> n = 10
>>> for _ in range(n):
	print(_ ** 2)

	
0
1
4
9
16
25
36
49
64
81

3、国际化:

这种情况下,"_"作为一个函数使用,通常用于实现国际化和本地化字符串之间翻译查找的函数名称。例如在Django文档 “转换”章节(https://docs.djangoproject.com/en/dev/topics/i18n/translation/)中,有如下代码:

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

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

  

名称前的单下划线

Python中使用名称前的单下划线,用于指定该名称属性为“私有”。

在一个类中的方法或属性使用单下划线开头,就是告诉别的程序这个方法或属性是私有的,然而对于这个名字来说并没有什么特别。

引自PEP-8:

单下划线:"内部使用"的弱指示。即,如果from <模块/包> import * 将不会引进用但下划线开头的对象。除非模块或包中的"__all__"列表显式地包含了它们。

 

名称前的双下划线

在Python中名称前的双下划线(__),对于解释器来说有其特殊的意义,Python中的这种用法是为了避免与子类定义的名称冲突。

Python文档指出:

任何__spam形式(至少两个下划线开头,至多一个下划线结尾)都是代替_classname__spam,其中classname是当前类的名字。

例如:

>>> class A:
	def _internal_use(self):
		pass
	def __method_name(self):
		pass

	
>>> dir(A)
['_A__method_name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_internal_use']

可以发现,"_internal_use"并未改变,而"__method_name"是"_A__method_name"。此时创建一个类A的子类B,那么不能轻易的重写父类A中的方法"__method_name",如下:

>>> class B(A):
	def __method_name(self):
		pass

	
>>> dir(B)
['_A__method_name', '_B__method_name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_internal_use']

  

名称前后的双下划线

这种用法表示Python中的特殊方法。是Python的一种约定,Python内部的名称,用来区别其他用户自定义的命名,以防冲突。

例如常见的__init__,__new__,__del__等。

posted on 2018-03-22 10:39  nicolas_Z  阅读(197)  评论(0)    收藏  举报

导航