访问限制
私有:只能自己使用,别人不能使用
好处:1.外部不能随意更改 提高了安全性
2.可以起到数据过滤的作用
格式:在构造函数变量的前边加上两个下划线__
看个案例:
创建一个Person类,有name和age两个属性,其中age为私有属性,不可从外部更改。
class Person:
def __init__(self):
self.name=None
self.__age=None # age前边加两个下划线是访问限制的标志
#这时候在进行创建对象并调用类属性的时候,对象是无法获得age的赋值权限的。
上边我们进行了对age的访问限制,但是真的就没有其他的方法去修改age的值了吗?答案是当然有!
1.创建在内部创建set和get函数
class Person:
def __init__(self):
self.name=None
self.__age=None
def setAge(self,a):
if a<0:
print("不合法")
else:
self.__age=a
def getAge(self):
return self.__age
p1=Person()
p1.setAge(-10)
print(p1.getAge())
通过这种方法,我们就达到了修改限制属性的值,访问限制还有一个比较有用的功能就是数据过滤的功能,这个就比较有用了,比如我上边的代码,如果我输入的年龄为负值,那么就提示我输入不合法,这样也就没有给age赋上值,只有输入正确的格式时才能进行赋值,所以这一功能也就避免了记录一些没有用的数值。
2.使用@property装饰器代替set,get方法进行外部访问限制
@property 是一个装饰器,当我们设置set,get时,代码会比较繁琐,这个装饰器就是解决这个问题的
@property 和set,get的使用区别是,当只为get行为添加装饰器@property时,
实例对象只能读取构造函数属性,但是不能进行修改,
如果想要修改必须为set行为添加@xx.setter装饰器(有@property时自动生成)。
看例子:
class Cat:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
#注意观察@name.setter写与不写,实例对象属性的变化
@name.setter
def name(self,value):
self.__name = value
c = Cat('小白')
c.name = '小花'#看变化
print(c.name)
通过这种方法,我们就达到了节省代码量的目的,也实现了访问限制。
下面看一个访问限制的作业题:
# 练习题:
# 有两只猫:
# 一只叫小花,今年3岁,花色。
# 另一只叫小白,今年3岁,白色。
# 请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字、年龄、颜色。
# 如果输入的小猫名错误,则显示 张老太没有这只猫。
# 要求:
# 猫的属性全为私有属性
# 通过set修改属性,通过get获取属性
class Cat:
def __init__(self):
self.__name = None
self.__age = None
self.__color = None
def set(self,name,age,color):
self.__name = name
self.__age = age
self.__color = color
def get(self):
return self.__name,self.__age,self.__color
c1,c2= Cat(),Cat()
c1.set('小花','3岁','花色')
c2.set('小白','3岁','白色')
cn = input('请输入猫名:')
if cn == '小花':
print(c1.get())
elif cn == '小白':
print(c2.get())
else:
print('张奶奶没有这只猫!')