通过"私有属性"实现数据的隐藏

一、引入

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岁了"

之所以出现这样的错误,究其原因是因为:我们通过对象直接给实例属性赋值的这种方式容易出错

如果在赋值的时候,是通过一个实例方法的调用,在方法中对数据进行严格的检查,合格的数据可以给属性设置,不合格的数据就提醒开发者,这样一来就能够保证数据的准确性了

那该怎样实现呢

答:

  1. 设置属性为私有属性
  2. 添加额外对属性操作的方法

二、实现对数据的隐藏

想要实现上述阐述的那个功能,我们需要做2件事情

  1. 设置属性为私有属性
  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.通过__可以将属性变为私有属性,这样就防止了通过对象直接操作属性时可能带来的隐患