摘要:原文地址这篇文章讨论中下划线的使用。跟中很多用法类似,下划线的不同用法绝大部分不全是都是一种惯例约定。这种情况,单下划线经常被用作国际化和本地化字符串翻译查询的函数名。
原文地址
这篇文章讨论Python中下划线_的使用。跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定。
主要有三种情况:
1. 解释器中_符号是指交互解释器中最后一次执行语句的返回结果。这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了。
>>> _ Traceback (most recent call last): File "", line 1, in NameError: name "_" is not defined >>> 42 >>> _ 42 >>> "alright!" if _ else ":(" "alright!" >>> _ "alright!"2. 作为名称使用
这个跟上面有点类似。_用作被丢弃的名称。按照惯例,这样做可以让阅读你代码的人知道,这是个不会被使用的特定名称。举个例子,你可能无所谓一个循环计数的值:
n = 42 for _ in range(n): do_something()3. i18n
_还可以被用作函数名。这种情况,单下划线经常被用作国际化和本地化字符串翻译查询的函数名。这种惯例好像起源于C语言。举个例子,在 Django documentation for translation 中你可能会看到:
from django.utils.translation import ugettext as _ from django.http import HttpResponse def my_view(request): output = _("Welcome to my site.") return HttpResponse(output)
第二种和第三种用法会引起冲突,所以在任意代码块中,如果使用了_作i18n翻译查询函数,就应该避免再用作被丢弃的变量名。
单下划线前缀的名称(例如_shahriar)以单下划线做前缀的名称指定了这个名称是“私有的”。在 有些 导入import * 的场景中,下一个使用你代码的人(或者你本人)会明白这个名称仅内部使用。Python documentation里面写道:
a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.
之所以说在在 有些 import * 的场景,是因为导入时解释器确实对单下划线开头的名称做了处理。如果你这么写from
以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Python documentation中提到,任何__spam这种形式(至少以两个下划线做开头,绝大部分都还有一个下划线做结尾)的标识符,都会文本上被替换为_classname__spam,其中classname是当前类名,并带上一个下划线做前缀。
看下面这个例子:
>>> 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了:
>>> 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__方法。
你也可以写出自己的“特殊方法”名(但是别这么做):
>>> class C(object): ... def __mine__(self): ... pass ... >>> dir(C) ... [..., "__mine__", ...]
还是不要这样写方法名,只让Python定义的特殊方法名使用这种惯例吧。
hackernews和reddit上的相关讨论
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/37494.html
摘要:概述这份声明了关于从文件路径自动加载类的规范。当根据完全限定类名加载对应的文件时由最开始的命名空间开始,连续的一个或多个命名空间组成的序列,不包括最前面的命名空间分隔符,在这个完全限定类名中这个序列称为命名空间前缀,对应了至少一个基础目录。 PSR-4:自动加载 翻译:薛粲授权许可:CC BY-NC 4.0 这份文档是《PSR-4: Autoloader》的非官方译文。 英文原文使用的...
摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...
摘要:在这个情况下我们可能需要使用构造函数,其以指定的模式来创造对象。构造函数也有自己的,值为,也通过其属性关联到。从逻辑上来说,这是以栈的形式实现的,它叫作执行上下文栈。 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 对象 原型链 构造函数 执行上下文栈 执行上下文 变量对象 活动对象 作用域链 闭包 Thi...
摘要:你可以进行如下操作需要注意的是这个窍门只适用于。在中就不需要进行操作了,因为它已经默认进行了。这里有几个例子可以供你参考译文出处本文根据的所译,整个译文带有我自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。 枚举 不要这么做: i = 0 for item in iterable: print i, item i += 1 而是这样: for...
摘要:在使用自定义响应类的应用中,和无法知道自定义类的细节,所以它们使用标准响应类来创建响应。有了这个自定义响应类,任何满足格式要求的文档都会自动被标记为内容类型,而其他响应则会继续获得默认的内容类型。 译文链接:编程派 原文链接:Flask Web Development作者的博客 有翻译或理解不对的地方,望大家指正! Flask框架中的响应类,命名很贴切,叫Response。不过...
阅读 2986·2020-01-08 12:17
阅读 1990·2019-08-30 15:54
阅读 1151·2019-08-30 15:52
阅读 2033·2019-08-29 17:18
阅读 1041·2019-08-29 15:34
阅读 2459·2019-08-27 10:58
阅读 1860·2019-08-26 12:24
阅读 368·2019-08-23 18:23