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__等。
浙公网安备 33010602011771号