• python3,设置只读属性


    设置只读属性

    一:设置只读属性的方式:

    1. class Person(object):
    2. def __init__(self):
    3. self.__age = 18
    4. # @property 可以使用属性的方式来访问这个方法
    5. @property
    6. def age(self):
    7. return self.__age
    8. p = Person()
    9. # 这样的实例属性进行赋值,相当于给这个实例加一个实例属性,并不是修改类里面的实例属性,因为双下划线是私有属性,不能读,不能写
    10. p.__age = 999
    11. print(p.__dict__) #
    12. # 这样实例对象读取实例方法以读取实例属性一样
    13. print(p.age) # 18
    14. # 只读赋值,不能修改,这样就无法修改. AttributeError: can't set attribute
    15. p.age = 888

     二:property的设置,对私有属性操作

    1. # property作用:
    2. # 可以将一些属性的操作方法关联到某一个属性
    3. """
    4. 概念:
    5. 经典类:没有继承(object)
    6. 新式类: 继承(object)
    7. python2版本定义一个类时,默认不继承(object)
    8. python3版本定义一个类时,继承(object)
    9. 建议使用新式类
    10. """
    11. # 查看当前的python版本是否继承(object)
    12. class Person01:
    13. pass
    14. # 输出有object,表示是新式类,可以不用定义类后面写object,但是为了兼容python2版本,建议写object
    15. print(Person01.__bases__) # (,)
    1. 一.property使用方式1
    2. class Person(object):
    3. def __init__(self):
    4. self.__age = 18
    5. def get_age(self):
    6. return self.__age
    7. def set_age(self, value):
    8. print("--set---")
    9. self.__age = value
    10. def del_age(self):
    11. print("--del--")
    12. del self.__age
    13. # 通过property合并三种实例方法来实现对私有属性的读,写,删。
    14. age = property(get_age, set_age, del_age)
    15. # 创建一个实例对象,以访问实例方法的形式来访问实例属性,这样就可以像操作实例属性那样操作。
    16. p = Person()
    17. print(p.age)
    18. # 通过实例方法的形式来修改实例私有属性,
    19. p.age = 80
    20. print(p.age)
    21. print(p.__dict__)
    22. #删除这个实例属性,
    23. del p.age
    24. print(p.__dict__)
    1. # 方式1补充,方式1其实还是可以通过实例内置的属性可以修改,不叫真正的只读,叫伪只读属性
    2. class Person(object):
    3. def __init__(self):
    4. self.__age = 18
    5. # 通过property来设置实例方式的形式进行对属性的访问
    6. @property
    7. def age(self):
    8. print("--get--")
    9. return self.__age
    10. p = Person()
    11. print(p.age)
    12. # 修改只读属性,失败
    13. # p.age = 999 # AttributeError: can't set attribute
    14. # 读取实例的所有属性,
    15. print(p.__dict__) # {'_Person__age': 18}
    16. #可以通过名转换来读取,_类名__age
    17. print(p._Person__age)
    18. # 修改只读属性
    19. p._Person__age = 888
    20. print(p.__dict__) # {'_Person__age': 888}
    1. #property使用方式2
    2. class Person(object):
    3. """
    4. 当我们通过实例.属性 = 值,给一个实例增加一个属性,或者说,修改一下属性值的时候,
    5. 都会调用方法,在这个方法内部,才会真正的把这个属性以及对应的数据存储到__dict__字典里面
    6. """
    7. def __setattr__(self, key, value):
    8. # 判定,key是否是我们要设置的只读属性名称,并且如果这个属性存在实例属性中,则只能读取,否则就增加
    9. if key == "age" and key in self.__dict__.keys():
    10. print("这个属性是只读属性,不能设置数据")
    11. else:
    12. self.__dict__[key] = value
    13. #
    14. p = Person()
    15. # p.age : 当我们通过实例.属性 = 值就调用__setattr_——方法来读取实例属性,如果当前的age是存在实例属性字典里,就读取,否则就增加这个实例属性
    16. p.age = 87
    17. print(p.__dict__) # {'age': 87}
    18. print(p.age) # 87
    19. # 上面操作已经添加到这个实例属性了,修改这个只读属性修改不成功
    20. p.age = 66 #调用__setattr_——方法, 返回: 这个属性是只读属性,不能设置数据返回
    21. print(p.age) # 还是87
    22. print(p.__dict__) # {'age': 87}

  • 相关阅读:
    python基于PHP+MySQL的校园帮忙领取快递平台
    15 OpenCV Sobel算子
    音视频—图像基础
    近日部分航院消息(6.30)
    【面试专题】设计模式篇①
    Unity脚本判断场景内物体是否为Root Prefab的方法
    FFmpeg音频重采样API(libswresample)
    Enterprise Architect安装与使用
    在线问卷调查有哪些优势?
    前后端分离跨域问题及SameSite=Lax解决方法
  • 原文地址:https://blog.csdn.net/fengge55/article/details/132733664