• Python面向对象7.隐藏数据


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

    一、引入

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

  • 相关阅读:
    最长上升序列,首尾连接
    带权并查集&&并查集
    开发者的小天地-1
    Binary Tree Maximum Path Sum
    Linked List Cycle II
    动归熟手题单
    java 正则表达式-忽略大小写与多行匹配
    KO之tab栏切换
    Vue中通过属性绑定为元素绑定style
    Vue中通过属性绑定为元素设置class
  • 原文地址:https://www.cnblogs.com/dong4716138/p/15726115.html
Copyright © 2020-2023  润新知