zoukankan      html  css  js  c++  java
  • Python中的下划线

    单下划线(_)

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

    1、在解释器中

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

    >>> _
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name '_' is not defined
    >>> 88
    >>> _
    88

    2、作为一个名称

    “_”作为临时性的名称使用。当其他人阅读你的代码时将会知道,你分配了一个临时用的名称。如下,你可能对循环计数中的实际值并不感兴趣,此时就可以使用“_”。

    n = 42
    for _ in range(n):
        print("hello,world!")

    3、国际化

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

    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)

    变量名前使用一个单下划线,称为保护变量。类似于惯例,其他人(或你自己)使用这些代码时将会知道以“_”开头的名称只供内部使用。应该将它们看作是一种实现细节,在修改它们时无需对外部通知。

    它对解释器来说有一定的意义,如果你写了代码“from <模块/包名> import *”,那么以“_”开头的名称都不会被导入,除非模块或包中的“__all__”列表显式地包含了它们。了解更多请查看“Importing * in Python”。

    名称前的双下划线(如:__shahriar)

    变量名(属性方法名)前加双下划线__称为私有变量,这种用法对解释器来说有特定的意义。Python中这种用法是为了避免与子类定义的名称冲突。“__spam”这种形式的标识符将会被“_classname__spam”这种形式取代,在这里“classname”是去掉前导下划线的当前类名。如下:

    >>> class Animal(object):
    ... def _dog(self):
    ... pass
    ... def __cat(self):
    ... pass
    ...
    >>> dir(Animal())
    ['_Animal__cat', ..., '_dog']

    正如所预料的,“_dog”并未改变,而“__cat”却被变成了“_Animal__cat”。此时,如果你创建Animal的一个子类B,那么你将无法轻易覆盖Animal中的方法“__cat”。

    >>> class B(A):
    ... def __cat(self):
    ... pass
    ...
    >>> dir(B())
    ['_Animal__cat', '_B__cat', ..., '_dog']

    这里的功能几乎和Java中的final方法和C++类中标准方法(非虚方法)一样。

    名称前后的双下划线(如:__init__)

    这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你可以覆盖这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。

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

    >>> class C(object):
    ... def __mine__(self):
    ... pass
    ...
    >>> dir(C)
    ... [..., '__mine__', ...]

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

  • 相关阅读:
    mysql命令集锦
    linux 删除文件名带括号的文件
    linux下的cron定时任务
    struts2文件下载的实现
    贴一贴自己写的文件监控代码python
    Service Unavailable on IIS6 Win2003 x64
    'style.cssText' is null or not an object
    "the current fsmo could not be contacted" when change rid role
    远程激活程序
    新浪图片病毒
  • 原文地址:https://www.cnblogs.com/juneman/p/9090546.html
Copyright © 2011-2022 走看看