在学习Python的时候,很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像 __this__ 这种。在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的大小写一样,或是一些其他语言中的 private 、 public 的作用一样,但仔细深究,这不全是Python这样设计的初衷。下面我们具体分析。
主要存在四种命名
1. object # 公用方法
2. __object__ # 内建方法,用户不要这样定义
3. __object # 全私有,全保护
4. _object # 半保护
核心风格:避免用下划线作为变量名的开始。
因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_object被看作是“私有的”,在模块或类外不可以使用,不能用'from module import *'导入。当变量是私有的时候,用_object来表示变量是很好的习惯。
单下划线+类名,eg:_Class__object 机制就可以访问__object__了。因为变量名__object__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;”双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。(如下列所示)
以单下划线开头_foo的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的__foo代表类的私有成员;以双下划线开头和结尾的__foo__代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。
class Foo(): def __init__(): ... def public_method(): print 'This is public method' def __fullprivate_method(): print 'This is fullprivate_method' def _halfprivate_method(): print 'This is halfprivate_method' f = Foo() f.public_method() # OK f.__fullprivate_method() # Error occur f._halfprivate_method() # OK f._Foo__fullprivate_method() # OK
从上面的例子可以看出,f._halfprivate_method()可以直接访问,确实是。不过根据python的约定,应该将其视作private,而不要在外部使用它们,(如果你非要使用也没辙),良好的编程习惯是不要在外部使用它。同时,根据Python docs的说明,_object和__object的作用域限制在本模块内。
大家看下面这段程序的输出:
class A(object): def __init__(self): self.__private() self.public() def __private(self): print 'A.__private()' def public(self): print 'A.public()'class B(A): def __private(self): print 'B.__private()' def public(self): print 'B.public()'b = B()
新闻热点
疑难解答