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爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
Nov 20 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
python实现KNN分类算法
Oct 16 Python
如何基于python生成list的所有的子集
Nov 11 Python
python 消除 futureWarning问题的解决
Dec 25 Python
如何在django中实现分页功能
Apr 22 Python
Keras自定义IOU方式
Jun 10 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
python与js主要区别点总结
Sep 13 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
python不同版本的_new_不同点总结
Dec 09 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/12/18 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
在JavaScript中访问字符串的子串
2015/07/07 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python协程用法实例分析
2015/06/04 Python
Python中return语句用法实例分析
2015/08/04 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
python通过实例讲解反射机制
2019/10/17 Python
详解Python中import机制
2020/09/11 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
介绍一下OSI七层模型
2012/07/03 面试题
公证委托书格式
2014/09/13 职场文书
迎国庆横幅标语
2014/10/08 职场文书
中英文求职信范文
2015/03/19 职场文书
财务会计求职信范文
2015/03/20 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android