# -*- 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()