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解析html开发库pyquery使用方法
Feb 07 Python
python进阶教程之循环对象
Aug 30 Python
python类中super()和__init__()的区别
Oct 18 Python
Python字典简介以及用法详解
Nov 15 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
python加载自定义词典实例
Dec 06 Python
Python输出指定字符串的方法
Feb 06 Python
python 实现表情识别
Nov 21 Python
python中翻译功能translate模块实现方法
Dec 17 Python
Python LMDB库的使用示例
Feb 14 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递归创建和删除文件夹的代码小结
2012/04/13 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
JavaScript经典案例之简易计算器
2020/08/24 Javascript
python中黄金分割法实现方法
2015/05/06 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
详解Python中的正则表达式
2018/07/08 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
表彰大会主持词
2014/03/26 职场文书
文明寝室标语
2014/06/13 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
感恩教育观后感
2015/06/17 职场文书
爱护公物主题班会
2015/08/17 职场文书
早安问候语大全
2015/11/10 职场文书
班主任寄语2016
2015/12/04 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
react中的DOM操作实现
2021/06/30 Javascript