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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
python实现批量获取指定文件夹下的所有文件的厂商信息
Sep 28 Python
调试Python程序代码的几种方法总结
Apr 28 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
Python 中包/模块的 `import` 操作代码
Apr 22 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
如何用python 操作zookeeper
Dec 28 Python
Python可视化学习之seaborn调色盘
Feb 24 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 采集书并合成txt格式的实现代码
2009/03/01 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
javascript 动态添加表格行
2006/06/22 Javascript
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
javascript iframe编程相关代码
2009/12/28 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
js实现返回顶部效果
2017/03/10 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
Python多线程下载文件的方法
2015/07/10 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
python 对key为时间的dict排序方法
2018/10/17 Python
python利用7z批量解压rar的实现
2019/08/07 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
迎新晚会主持词
2014/03/24 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
大学生学年个人总结
2015/02/15 职场文书