面向对象编程案例04--访问控制

# -*- coding: utf-8 -*-
#python 27
#xiaodeng
#面向对象编程案例04--访问控制
#如果要让内部属性不被外部所访问,怎么做?
#在属性的名称前加上两个下划线__即可,在python中,实例变量名下面如果加上__开头,就变成了一个私有变量private
#只有内部可以访问,而外部不能去访问
#demo

#01
class Student():
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
    def printAge(self):
        print '%s:%s'%(self.__name,self.__age)


if __name__=="__main__":
    bart=Student('xiaodeng',28)
    #外部的代码不能随意修改对象内部的状态,这样通过访问限制的保护、代码更加健壮
    #bart.__name #出现错误无法访问私有属性
    bart.printAge()



#02
#如果获得__name属性呢?给Student类新增getName和getAge方法
##############修改上面的案例#####################
print '--'*25
class Student():
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
    def printAge(self):
        print '%s:%s'%(self.__name,self.__age)
        
    #如果获得__name属性呢?给Student类新增getName和getAge方法    
    def getName(self):#getName
        return self.__name
    
    def getAge(self):#getAge
        return self.__age

if __name__=="__main__":
    bart=Student('xiaodeng',28)
    print bart.getName()
    print bart.getAge()
    bart.printAge()



#03
#如果要允许从外部代码中修改Age怎么办?
##############修改上面的案例#####################
print '--'*25
class Student():
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
    def printAge(self):
        print '%s:%s'%(self.__name,self.__age)
        
    def getName(self):
        return self.__name
    
    def getAge(self):
        return self.__age
    
    #设置实例属性
    def setAge(self,age):#setAge
        if 20<age<100:
            self.__age=age
        else:
            raise ValueError('error age')

if __name__=="__main__":
    bart=Student('xiaodeng',28)
    bart.setAge(30)
    print bart.getAge()
    bart.printAge()