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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
Python中模块string.py详解
Mar 12 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
使用python为mysql实现restful接口
Jan 05 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Python实现像awk一样分割字符串
Sep 15 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
Zerg剧情介绍
2020/03/14 星际争霸
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
js中arguments对象的深入理解
2019/05/14 Javascript
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
python logging 日志的级别调整方式
2020/02/21 Python
python交互模式基础知识点学习
2020/06/18 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
python三引号如何输入
2020/07/06 Python
Python 实现微信自动回复的方法
2020/09/11 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
有个性的自我评价范文
2013/11/15 职场文书
食品安全责任书范本
2015/05/09 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
功夫熊猫观后感
2015/06/10 职场文书
公司备用金管理制度
2015/08/04 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python