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 相关文章推荐
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
python实现识别相似图片小结
Feb 22 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
简单了解python的break、continue、pass
Jul 08 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
python+rsync精确同步指定格式文件
Aug 29 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
python中re模块知识点总结
Jan 17 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
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
pandas 层次化索引的实现方法
2019/07/06 Python
python实现串口通信的示例代码
2020/02/10 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
酒店管理毕业生自荐信
2013/10/24 职场文书
综治维稳工作汇报
2014/10/27 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers