关闭

Python中的单/双下划线

标签: Python
933人阅读 评论(0) 收藏 举报
分类:

原文地址: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 中的下划线命名规则

http://my.oschina.net/leejun2005/blog/387136 


这篇文章讨论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会改写这些名称,以免与子类中定义的名称产生冲突。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定义的特殊方法名使用这种惯例吧。


0
0
查看评论

python 里面的单下划线与双下划线的区别

主要存在四种命名1. object # 公用方法 2. __object__ # 内建方法,用户不要这样定义 3. __object # 全私有,全保护 4. _object # 半保护核心风格:避免用下划线作为变量名的开始。因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序...
  • dqchouyang
  • dqchouyang
  • 2016-03-08 23:34
  • 942

Python中单下划线,双下划线,俩头下划线的区别。

示例>>> class student(object): __name = 0 _sex = 'male' >>> student.__dict__ mappingproxy({'__module__': ...
  • qq_39739038
  • qq_39739038
  • 2017-08-24 19:02
  • 120

python中下划线,双下划线,首尾双下划线的区别(Difference between _, __ and __xx__ in Python)

Difference between _, __ and __xx__ in Python When learning Python many people don't really understand why so much underlines in the beginning ...
  • u011089523
  • u011089523
  • 2016-03-16 20:47
  • 483

Python单双下划线,前后下划线解读

原文请点击src Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始。 因为下划线对...
  • what_lei
  • what_lei
  • 2015-11-06 11:32
  • 1360

python类-各种双下划线

__slots__ 用来限制类中的实例属性 每个实例对象 x 都拥有一个字典 x.__dict__. python通过此字典允许你绑定任意属性给 x 实例.  定义一个名为 __slots__ 的类属性可以有效减少每个实例占用的内存数量.  __slots__ 是一个字符...
  • sunyonggao
  • sunyonggao
  • 2013-06-29 14:02
  • 1426

Python单下划线和双下划线

Python 用下划线作为变量前缀和后缀指定特殊变量。 _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始。 因为下划线...
  • tyq101010
  • tyq101010
  • 2017-04-21 09:37
  • 156

PYTHON中对象命名的单下划线与双下划线的区别(私有和保护)

Python中用单双下划线作为变量前缀和后缀指定特殊变量的意义: _name 不能用'from moduleimport *'导入 __name__ 系统定义名字 __xxx 类中的私有变量名因为下划线对解释器有特殊的意义,而且是内建标识符所使用的...
  • boyun58
  • boyun58
  • 2017-08-12 21:40
  • 215

理解Python的双下划线命名(转过来慢慢理解)

分类: Python2012-05-30 16:37 2567人阅读 评论(0) 收藏 举报 pythonclassobject脚本扩展语言 [python] view plaincopy ...
  • oMingZi12345678
  • oMingZi12345678
  • 2014-09-22 10:00
  • 717

php中以双下划线打头的作用

命名的规则 加一个为私有的 加两个一般都是系统默认的,系统预定义的,即所谓: ==== “魔术方法”与“魔术常量” ==== ★PHP双下划线函数即“魔术方法”: 5、__construct、__destruct __construct 构造方法,当一个对象创建时调用此方法。 __dest...
  • qq_27289001
  • qq_27289001
  • 2015-12-15 23:24
  • 904

python学习笔记---单下划线双下滑线变量及方法

# -*- coding: utf-8 -*- from __future__ import unicode_literals c = 20 _m = 190 # 不能被别的模块from han import × class Animal(object): __a = 11...
  • qq_34964399
  • qq_34964399
  • 2018-01-21 13:49
  • 35
    个人资料
    • 访问:248112次
    • 积分:3126
    • 等级:
    • 排名:第13185名
    • 原创:87篇
    • 转载:94篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论