命名规则:

通常使用小写单词,必要时用下划线分隔增加可读性.

使用一个前导下划线仅用于不打算作为类的公共接口的内部方法和实例变量. Python不强制要求这样; 它取决于程序员是否遵守这个约定. 使用两个前导下划线以表示类私有的名字. Python将这些名字和类名连接在一起:

如果类Foo有一个属性名为 __a, 它不能以Foo.__a访问. (执著的用户(An insistent user)还是可以通过Foo._Foo__a得到访问权.) 通常,双前导下划线应该只用来避免与类(为可以子类化所设计)中的属性发生名字冲突

我们都知道,Python没有“私有变量”这样的说法,如果想访问,始终是有办法,但使用双下划线“__”,可以很大程度上实现“私有”。这里无需多言。

那么单下划线“_“开始的特性呢?很多书里面都没有说清楚,这里我谈谈我的看法。如果不对,欢迎各位指正。

直接上简单代码:

Python中访问特性一般使用“访问器”(SetXXX,GetXXX这类的方法),但是为了看效果,这里使用“实例.变量”的方法访问。

>>> ap = A()
>>> ap.a
'a'
>>> ap._a
'_a'
>>> ap.__a
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: A instance has no attribute '__a'

也就是说,真正能起到“私有”作用的,还是“__”。这样使用双下划线,又被称为name-mangling。

那么,单下划线开头的特性到底有什么用呢?

If you don’t want the name-mangling effect, but you still want to send a signal for other
objects to stay away, you can use a single initial underscore.

----《Beginning Python From Novice to Professional》

因为我个人英文不好,我的理解是这样:如果你不想使用“__”,但是又想让其他对象远离它,那就使用“_”。

总结:

1.带有单下划线的特性不会被 from module import *导入。

2.单下划线是Python程序员使用类时的约定,表明程序员不希望类的用户直接访问属性。仅仅是一种约定!实际上,实例._变量,可以被访问。

3、__xxx___ 定义的是特列方法。像__init__之类的

才学Python没有多久,如果说的不好的,希望各位大神指正。

参考1:http://blog.donews.com/vaneoooo/archive/2006/02/28/746936.aspx

参考2:http://blog.163.com/jackylau_v/blog/static/175754040201182113817834/

ps:参考2个人觉得问题好多。其中以下我表示是不是有问题??

“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
“双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

-------------------------------------------------------2012.11.13晚割-------------------------------------------------------
在同学指点下,看了PEP 8

_single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.

又看了翻译的PEP 8:http://wiki.woodpecker.org.cn/moin/PythonCodingRule

方法名和实例变量

(Method Names and Instance Variables)

    • 这段大体上和函数相同:通常使用小写单词,必要时用下划线分隔增加可读性. 使用一个前导下划线仅用于不打算作为类的公共接口的内部方法和实例变量. Python不强制要求这样; 它取决于程序员是否遵守这个约定. 使用两个前导下划线以表示类私有的名字. Python将这些名字和类名连接在一起:

      如果类Foo有一个属性名为 __a, 它不能以Foo.__a访问. (执著的用户(An insistent user)还是可以通过Foo._Foo__a得到访问权.) 通常,双前导下划线应该只用来避免与类(为可以子类化所设计)中的属性发生名字冲突.

python ——单下划线(约定)的更多相关文章

  1. python单下划线与双下划线的区别

    Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...

  2. python单下划线、双下划线、头尾双下划线说明:

      单下划线.双下划线.头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的. _foo: 以单下划线开头的表示的是 protected 类 ...

  3. python 单下划线/双下划线使用总结

    文章转自:http://blog.csdn.net/pfm685757/article/details/45918575

  4. python 单下划线和双下划线

    underline.py __all__ = ['_underline_variable', '__underline_variable', '_underline_func', '__underli ...

  5. python 单下划线与双下划线的区别

    来自为知笔记(Wiz)

  6. python 名称前的单下划线

    单前导下划线 _var 1.特点一 在PEP8约定中定义,以单个下划线开头的变量或方法仅供内部使用.用于指定该名称属性为“私有”.为了使其他人(或你自己)使用这些代码时将会知道以“_”开头的名称只供内 ...

  7. python类中方法加单下划线、双下划线、前后双下滑线的区别

    首先看一段代码: class Foo(): def __init__(self): print "__init__ method" def public_method(self): ...

  8. python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  9. Python笔记_第三篇_面向对象_4.单下划线和双下划线

    说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...

随机推荐

  1. JSP、JSTL、EF学习笔记

    JSP 1)Java Server Page,在html中嵌入java代码 2)九个内置(隐式)对象 request response out page pageContext config sess ...

  2. 转载:Posix线程编程指南(2)

    概念及作用 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据.在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有.但有时应用程序设计中有必要提供 ...

  3. Centos6.5配置阿里云yum源

    很多时候,centos6.5 yum源可能无法访问,报404等等问题,一般情况下我们可以将yum源配置成阿里云的源,当然也可以配置成163的,简单说一下配置成阿里云的: 阿里云镜像源地址:http:/ ...

  4. django视图重定向

    # 原创,转载请留言联系 当请求访问到某个视图时,我们想让它重定向到其他页面,应该怎么做呢? 1.HttpResponseRedirect 需求:当我们访问127.0.0.1/my_redirect时 ...

  5. Python的程序结构[2] -> 类/Class[6] -> 内建类 map

    内建类map / Built-in Type map 关于内建类 map 是一个内建的类,能够返回一个 map 的 obj.map 的第一个参数为一个可执行函数,后续参数均为可迭代对象,map 会分别 ...

  6. 在CentOS 7上安装Node.js

    一.安装1.进入官网下载最新版本https://nodejs.org/en/ 选择下载后上传或直接使用wget下载 wget https://nodejs.org/dist/v8.11.2/node- ...

  7. ReactiveCocoa(一)

    前言 之前总听别人说什么Reactive Cocoa + MVVM,但是没有找到讲解Reactive Cocoa相关的资料.结果进入新公司,项目里面有部分代码使用到了Reactive Cocoa,所以 ...

  8. 【bzoj2839】【集合计数】容斥原理+线性求阶乘逆元小技巧

    (上不了p站我要死了,侵权度娘背锅) Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取 ...

  9. 在SQL Server中查看对象依赖关系

    原文 在SQL Server中查看对象依赖关系 Viewing object dependencies in SQL Server   Deleting or changing objects may ...

  10. XCode工程内多Targets教程

    作者  透明de面具 原帖地址  http://www.cocoachina.com/bbs/read.php?tid-10972-fpage-0-toread--page-1.html    相信很 ...