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基于右递归解决八皇后问题的方法
May 25 Python
Python进阶篇之字典操作总结
Nov 16 Python
用python实现百度翻译的示例代码
Mar 09 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
python顺序执行多个py文件的方法
Jun 29 Python
python中的函数递归和迭代原理解析
Nov 14 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
Sep 01 Python
python lambda的使用详解
Feb 26 Python
Python实现socket库网络通信套接字
Jun 04 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 md5下16位和32位的实现代码
2008/04/09 PHP
PHP中的array数组类型分析说明
2010/07/27 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
php实现多城市切换特效
2015/08/09 PHP
prototype1.4中文手册
2006/09/22 Javascript
JS input 数字验证代码
2009/07/30 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
理解Javascript_13_执行模型详解
2010/10/20 Javascript
jquery实现心算练习代码
2010/12/06 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
Javascript中Array.prototype.map()详解
2014/10/22 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
如何做好总经理助理
2013/11/12 职场文书
房产代理公证处委托书
2014/04/04 职场文书
机械专业技术员求职信
2014/06/14 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
财务会计求职信范文
2015/03/20 职场文书
爱心捐书倡议书
2015/04/27 职场文书
《山中访友》教学反思
2016/02/24 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python