在学习 Python 的时候, 会不理解为什么在方法 (method) 前面会加好几个下划线, 有时甚至两边都会加. 在 Python 中下划线还具有 private 和 protected 类似的访问权限作用, 下面我们具体分析.
Python 主要存在四种命名:
- (1)object #公用方法
- (2)__object__ #内建方法, 用户不要这样定义
- (3)__object #全私有, 全保护(private)
- (4)_object #半保护(protected)
核心风格: 避免用下划线作为变量名的开始.
因为下划线对解释器有特殊的意义, 而且是内建所使用的符号, 我们建议避免用下划线作为变量名的开始. 一般来讲, 变量名_object 被看作是 "私有 的", 在模块或类外不可以使用, 不能用'from moduleimport *'导入. 当变量是私有的时候, 用_object 来表示变量是很好的习惯. 因为变量名__object__对 Python 来说有特殊含义, 对于普通的变量应当避免这种命名风格.
python 有关 private 的描述, python 中不存在 protected 的概念, 要么是 public 要么就是 private, 但是 python 中的 private 不像 C++, Java 那样, 它并不是真正意义上的 private, 通过 name mangling(名称改编 (目的就是以防子类意外重写基类的方法或者属性), 即前面加上 "单下划线"+ 类名, eg:_Class__object) 机制就可以访问 private 了.
"单下划线" 开始的成员变量叫做保护变量, 意思是只有类对象和子类对象自己能访问到这些变量;"双下划线" 开始的是私有成员, 意思是只有类对象自己能访问, 连子类对象也不能访问到这个数据.(如下列所示)
以单下划线开头 (_foo) 的代表不能直接访问的类属性, 需通过类提供的接口进行访问, 不能用 "from xxx import *" 而导入; 以双下划线开头的 (__foo) 代表类的私有成员; 以双下划线开头和结尾的 (__foo__) 代表里特殊方法专用的标识, 如 __init__()代表类的构造.
- class Foo():
- def __init__():
- ...
- def public_method():
- print 'This is public method'
- def __fullprivate_method():
- print 'This is underscore leading method'
- def _halfprivate_method():
- print 'This is one underscore leading method'
实例化 Foo 的一个对象,
- 1. f = Foo()
- 1. f.public_method() # OK
- 2.
- 3. f.__fullprivate_method() # Error occur
- 4.
- 5. f._halfprivate_method() # OK
- 6.
- 7. f._Foo__fullprivate()_method() # OK
从上面的例子可以看出, f._halfprivate_method()可以直接访问, 确实是. 不过根据的约定, 应该将其视作 private, 而不要在外部使用它们,(如果你非要使用也没辙),
良好的习惯是不要在外部使用它. 同时, 根据 Python docs 的说明,_object 和__object 的作用域限制在本模块内
来源: http://www.bubuko.com/infodetail-2947920.html