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 splitlines使用技巧
Sep 06 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
Python闭包函数定义与用法分析
Jul 20 Python
python2与python3中关于对NaN类型数据的判断和转换方法
Oct 30 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
详解python实现交叉验证法与留出法
Jul 11 Python
如何使用Python调整图像大小
Sep 26 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 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(2)――PHP类型
2010/02/15 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
举例讲解Python中is和id的用法
2015/04/03 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
深入了解Python 变量作用域
2020/07/24 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
大学生物业管理求职信
2013/10/24 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
嘉宾邀请函
2015/01/31 职场文书
神龙架导游词
2015/02/11 职场文书
横空出世观后感
2015/06/09 职场文书
催款函怎么写
2015/06/24 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL