python ——单下划线(约定)

命名规则:

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

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

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

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

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

直接上简单代码:

[python] 
>>> class A:  
...     def __init__(self):  
...         self.a = 'a'  
...         self._a = '_a'  
...         self.__a = '__a'  
...  

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

[python] 
>>> 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得到访问权.) 通常,双前导下划线应该只用来避免与类(为可以子类化所设计)中的属性发生名字冲突.

原文地址:https://www.cnblogs.com/Simon-xm/p/3890792.html