通过"私有属性"实现数据的隐藏
一、引入
class Cat(object):
def __init__(self, new_name, new_age):
self.name = new_name
self.age = new_age
def print_info(self):
print("我叫%s,今年%s了" % (self.name, self.age))
# 创建猫对象
cat = Cat("波斯猫", 4)
# 调用方法
cat.print_info()
# 尝试修改属性
cat.age = -10
# 调用方法
cat.print_info()
如果运行上述代码,会发现,第二次输出的信息有误,其为"我交波斯猫,今年-10岁了"
之所以出现这样的错误,究其原因是因为:我们通过对象直接给实例属性赋值的这种方式容易出错
如果在赋值的时候,是通过一个实例方法的调用,在方法中对数据进行严格的检查,合格的数据可以给属性设置,不合格的数据就提醒开发者,这样一来就能够保证数据的准确性了
那该怎样实现呢
答:
- 设置属性为私有属性
- 添加额外对属性操作的方法
二、实现对数据的隐藏
想要实现上述阐述的那个功能,我们需要做2件事情
- 设置属性为私有属性
- 添加额外对属性操作的方法
1. 设置属性为私有属性
在Python中,如果想要设置为私有的属性,那么仅仅需要在定义属性时在前面加两个下划线__
即可
示例如下
class 类名(object):
def __init__(self):
self.name = "王老师"
self.__age = 18 # 这个属性就是私有属性
既然有了私有属性,那对象能够直接操作它呢?
答:不能,否则就没有私有的作用了
示例如下
class Teacher(object):
def __init__(self):
self.name = "王老师"
self.__age = 18 # 这个属性就是私有属性
t = Teacher()
print(t.name) # 能够获取
print(t.__age) # 此时会程序报错,因为__age是私有属性,不能通过对象直接操作
2. 添加额外对属性操作的方法
想要实现对私有属性的操作,我们需要定义方法,在方法中操作
示例
class Teacher(object):
def __init__(self):
self.name = "王老师"
self.__age = 18 # 这个属性就是私有属性
def set_age(self, new_age):
if 1 <= new_age <= 120:
self.__age = new_age
print("设置年龄成功")
else:
print("年龄数据有误...")
def get_age(self):
return self.age
t = Teacher()
t.set_age(20) # 设置年龄
print(t.get_age()) # 获取年龄
三、总结
1.操作属性有2种方法
直接通过对象名修改
对象名.属性名 = 数据
通过方法间接修改
对象名.方法名(数据)
2.通过使用方法来进行修改,就可以在方法中进行数据合法性的检查
3.通过__
可以将属性变为私有属性,这样就防止了通过对象直接操作属性时可能带来的隐患