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中 Lambda表达式全面解析
Nov 28 Python
python 计算文件的md5值实例
Jan 13 Python
浅谈Python中的私有变量
Feb 28 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
Python列表对象实现原理详解
Jul 01 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
使用Python的Turtle绘制哆啦A梦实例
Nov 21 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
Python学习之time模块的基本使用
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
探讨如何把session存入数据库
2013/06/07 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
phplot生成图片类用法详解
2015/01/06 PHP
eclipse php wamp配置教程
2016/06/30 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
Python对文件操作知识汇总
2016/05/15 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
用Python解决x的n次方问题
2019/02/08 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
区优秀教师事迹材料
2014/02/10 职场文书
老同学聚会感言
2014/02/23 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers