Python 面向对象 成员的访问约束

在Java,C++,以及PHP中都有对应的关键字,public,protected,private,但是在Python中却没有这些关键字来声明类成员的访问作用域。

在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!


原文链接:点击打开链接


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值