在Python中,通过一套命名体系来识别成员的访问范围。
class MyClass(object):
username = "python" #变量名以字母开头 public
_email = "python@163.com" #变量名以单下划线开头 protected
__tel = "18811654088" #变量名以双下划线开头 private
def __init__(self):
pass
从这段代码中可以看出一些巧妙的命名方法。
在python中所有的以字母开头的成员名称被python命名体系自动识别为public,
单个下划线开头的成员(如 _foo)被识别为protected,只有类对象和子类对象自己能访问到这些变量,不能用“from xxx import *”而导入;
双下划线开头的成员(如__foo)被识别为private,只有类对象自己能访问,连子类对象也不能访问到这个数据;
以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。
python的简洁和优美就在于此。
下面我们看一个例子:
class A(object):
username = "python" #变量名以字母开头 public
_email = "python@163.com" #变量名以单下划线开头 protected
__tel = "18811654088" #变量名以双下划线开头 private
def __init__(self):
print 'A.__init__() is called!'
def __func(self):#私有方法
print "A.__func() is called!"
class B(A):
pass
class C(B):
pass
if __name__=='__main__':
a=A()
b=B()
c=C()
print 'A.username=',A.username #外界可访问类的公有属性
print 'A._email=',A._email #外界可访问类的受保护的属性
#print A.__tel # AttributeError 类的私有属性,外界不可访问
#a.__func() #外界不可访问私有方法
'''类的内部定义中,所有以双下划线开始的名字都被‘翻译’成前面加上单下划线和类名的形式。
因此,可以像下面这样来访问私有属性和私有方法。
'''
print 'A.__tel=',A._A__tel #可以这样来访问类的私有属性
a._A__func() #可以这样来调用私有方法
print '--------------------------------'
print 'B.username=',B.username #类A的公有属性,可以通过其子类B进行访问
print 'B._email=',B._email #类A的受保护的属性,可以通过其子类B进行访问
#print B.__tel #类A的私有属性,其子类B不可访问:AttributeError
print 'B.__tel=',B._A__tel #可以这样,通过类B访问 继承而来的私有属性
#b.__func() #AttributeError: 'B' object has no attribute '__func'
b._A__func()#可以这样,调用继承而来的私有方法
print '--------------------------------'
print 'C.username=',C.username#类A的公有属性,可以通过其子孙类C进行访问
print 'C._email=',C._email #类A的受保护的属性,可以通过其子孙类C进行访问
#print C.__tel #类A的私有属性,其子孙类C不可访问:AttributeError
print 'C.__tel=',C._A__tel #可以这样,通过类C访问 继承而来的私有属性
#c.__func()#AttributeError: 'C' object has no attribute '__func'
c._A__func()#可以这样,调用 继承而来的私有方法
'''以单下划线开始的受保护的属性,有啥用呢?
前面有单下划线的名字都不会被带星号的import语句(from module import *)导入
'''
运行结果:
A.__init__() is called!
A.__init__() is called!
A.__init__() is called!
A.username= python
A._email= python@163.com
A.__tel= 18811654088
A.__func() is called!
--------------------------------
B.username= python
B._email= python@163.com
B.__tel= 18811654088
A.__func() is called!
--------------------------------
C.username= python
C._email= python@163.com
C.__tel= 18811654088
A.__func() is called!
原文链接:点击打开链接