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 13 Python
Python内置函数bin() oct()等实现进制转换
Dec 30 Python
python检测某个变量是否有定义的方法
May 20 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
python 导入数据及作图的实现
Dec 03 Python
python3.x中安装web.py步骤方法
Jun 23 Python
Django封装交互接口代码
Jul 12 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 Python
pytorch 实现在测试的时候启用dropout
May 27 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP检测用户语言的方法
2015/06/15 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
2019/05/24 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
使用JS来动态操作css的几种方法
2019/12/18 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
在windows系统中实现python3安装lxml
2016/03/23 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
Python的缺点和劣势分析
2019/11/19 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
PHP面试题大全
2015/10/16 面试题
酒店总经理欢迎词
2014/01/15 职场文书
关于安全的演讲稿
2014/05/09 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
先进工作者申报材料
2014/12/23 职场文书
导游词之岳阳楼
2019/09/25 职场文书
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电