python防止随意修改类属性的实现方法


Posted in Python onAugust 21, 2019

如果不想允许随意修改一个类的某个属性,常用的方法是使用property装饰器以及在属性前加下划线。

class V:
  def __init__(self, x): 
    self._x = x
  
  @property
  def x(self):
    return self._x

虽然这样是没法直接修改x了,但还是可以通过_x很轻易地修改x。

>>>v = V(5)
>>>v.x
5
>>>v._x
5
>>>v.x = 4
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: cant set attribute
>>>v._x = 4
>>>v.x
4

万一哪天手抖了呢...

但如果使用双下划线——

class V:
  def __init__(self,x):
    self.__x = x

  @property
  def x(self):
    return self.__x
>>>v = V(5)
>>>v.__x = 4
>>>v.__x
4
>>>v.x
5

原因在于python的名称改写特性(name mangling)。python会将以双下划线开头的实例属性名前加上一个下划线和类名存入实例的__dict__属性中。

>>>v = V(5)
>>>v.__dict__
{'_V__x': 5}
>>>v.__x = 4
>>>v.__dict__
{'_V__x': 5, '__x': 4}

当然,修改v.x的值还是可以做到的的,只需通过修改v._V__x就可以了,不过误操作的可能性已经降低很多了。

p.s.类也有__dict__属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现批量转换文件编码(批转换编码示例)
Jan 23 Python
python实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
python使用itchat实现手机控制电脑
Feb 22 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
基于python requests库中的代理实例讲解
May 07 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
Python语言进阶知识点总结
May 28 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
python自定义时钟类、定时任务类
Feb 22 Python
PyCharm中关于安装第三方包的三个建议
Sep 17 Python
python性能测试工具locust的使用
Dec 28 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 Python
python进阶之自定义可迭代的类
Aug 20 #Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 #Python
django中使用POST方法获取POST数据
Aug 20 #Python
python实现猜拳小游戏
Apr 05 #Python
django 自定义filter 判断if var in list的例子
Aug 20 #Python
python并发编程多进程 模拟抢票实现过程
Aug 20 #Python
python3的数据类型及数据类型转换实例详解
Aug 20 #Python
You might like
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
js图片延迟加载(Lazyload)三种实现方式
2017/03/01 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
python执行外部程序的常用方法小结
2015/03/21 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
Django-migrate报错问题解决方案
2020/04/21 Python
python从Oracle读取数据生成图表
2020/10/14 Python
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
优秀党员转正的自我评价
2013/10/06 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
城管大队整治方案
2014/05/06 职场文书
材料物理专业求职信
2014/09/01 职场文书
离婚协议书格式
2014/11/21 职场文书
门面房租房协议书
2014/12/01 职场文书
2015年防汛工作总结
2015/05/15 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
用php如何解决大文件分片上传问题
2021/07/07 PHP
python基础之错误和异常处理
2021/10/24 Python
python画条形图的具体代码
2022/04/20 Python