Python中的单/双下划线
2015-07-07 22:12
746 查看
原文地址:http://shahriar.svbtle.com/underscores-in-python
参考地址:
[1] Importing `*` in Python
http://shahriar.svbtle.com/importing-star-in-python
[2] 理解Python的双下划线命名
http://blog.csdn.net/zhu_liangwei/article/details/7667745
[3] Pyth详解 Python 中的下划线命名规则
http://www.zhihu.com/question/19754941
[4]详解 Python 中的下划线命名规则
/article/2204332.html
这篇文章讨论Python中下划线
单个下划线(
主要有三种情况:
Django documentation for translation 中你可能会看到:
第二种和第三种用法会引起冲突,所以在任意代码块中,如果使用了
单下划线前缀的名称(例如
以单下划线做前缀的名称指定了这个名称是“私有的”。在 有些 导入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 * 的场景,是因为导入时解释器确实对单下划线开头的名称做了处理。如果你这么写
* in Python”。
双下划线前缀的名称(例如
以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Python
documentation中提到,任何
看下面这个例子:
正如所料,
这种特定的行为差不多等价于Java中的
前后都带有双下划线的名称(例如
这些是Python的特殊方法名,这仅仅是一种惯例,一种确保Python系统中的名称不会跟用户自定义的名称发生冲突的方式。通常你可以覆写这些方法,在Python调用它们时,产生你想得到的行为。例如,当写一个类的时候经常会覆写
你也可以写出自己的“特殊方法”名(但是别这么做):
还是不要这样写方法名,只让Python定义的特殊方法名使用这种惯例吧。
参考地址:
[1] Importing `*` in Python
http://shahriar.svbtle.com/importing-star-in-python
[2] 理解Python的双下划线命名
http://blog.csdn.net/zhu_liangwei/article/details/7667745
[3] Pyth详解 Python 中的下划线命名规则
http://www.zhihu.com/question/19754941
[4]详解 Python 中的下划线命名规则
/article/2204332.html
这篇文章讨论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 <module/package> import *,任何以单下划线开头的名称都不会被导入,除非模块/包的
__all__列表明确包含了这些名称。更多相关信息见““Importing
* in Python”。
双下划线前缀的名称(例如__shahriar
)
以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Pythondocumentation中提到,任何
__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定义的特殊方法名使用这种惯例吧。
相关文章推荐
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
- MySQL Python Windows下的安装经历(失败)
- 机器学习算法与Python实践之(二)支持向量机(SVM)初级
- Python升级pip到更高版本 You are using pip version 7.0.3, however version 7.1.0 is available.
- Python 爬虫示例
- python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法
- 浅析Python虚拟机执行框架
- Python下opencv使用笔记(二)(简单几何图像绘制)
- Mac selenium python版本安装
- python yield
- Python
- python 内存管理
- Python学习之语句、列表
- python with用法
- Python列表常用操作
- Python打印斐波拉契数列实例
- [译]2.Python扩展外置模块定义新类型——类型方法
- 设置python 命令行交互程序自动补齐
- python学习-循环线程
- 创业公司都在使用的3款Python库