Python 定义只读属性的实现方式


Posted in Python onMarch 05, 2020

Python是面向对象(OOP)的语言, 而且在OOP这条路上比Java走得更彻底, 因为在Python里, 一切皆对象, 包括int, float等基本数据类型.

在Java里, 若要为一个类定义只读的属性, 只需要将目标属性用private修饰, 然后只提供getter()而不提供setter(). 但Python没有private关键字, 如何定义只读属性呢? 有两种方法, 第一种跟Java类似, 通过定义私有属性实现. 第二种是通过__setattr__.

通过私有属性

Python里定义私有属性的方法见 https://3water.com/article/181953.htm.

用私有属性+@property定义只读属性, 需要预先定义好属性名, 然后实现对应的getter方法.

class Vector2D(object):
 def __init__(self, x, y):
 self.__x = float(x)
 self.__y = float(y)

 @property
 def x(self):
 return self.__x
 @property
 def y(self):
 return self.__y

if __name__ == "__main__":
 v = Vector2D(3, 4)
 print(v.x, v.y)
 v.x = 8 # error will be raised.

输出:

(3.0, 4.0)
Traceback (most recent call last):
 File ...., line 16, in <module>
 v.x = 8 # error will be raised.
AttributeError: can't set attribute

可以看出, 属性x是可读但不可写的.

通过__setattr__

当我们调用obj.attr=value时发生了什么?

很简单, 调用了obj的__setattr__方法. 可通过以下代码验证:

class MyCls():
 def __init__(self):
 pass

 def __setattr__(self, f, v):
 print 'setting %r = %r'%(f, v)
if __name__ == '__main__':
 obj = MyCls()
 obj.new_field = 1

输出:

setting 'new_field' = 1

所以呢, 只需要在__setattr__ 方法里挡一下, 就可以阻止属性值的设置, 可谓是釜底抽薪.

代码:

# encoding=utf8
class MyCls(object):
 readonly_property = 'readonly_property' 
 def __init__(self):
 pass
 def __setattr__(self, f, v):
 if f == 'readonly_property':
  raise AttributeError('{}.{} is READ ONLY'.\
     format(type(self).__name__, f))

 else:
  self.__dict__[f] = v

if __name__ == '__main__':
 obj = MyCls()

 obj.any_other_property = 'any_other_property'
 print(obj.any_other_property)

 print(obj.readonly_property)
 obj.readonly_property = 1

输出:

any_other_property
readonly_property
Traceback (most recent call last):
 File "...", line 21, in <module>
 obj.readonly_property = 1
 ...
 AttributeError: MyCls.readonly_property is READ ONLY

以上这篇Python 定义只读属性的实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
python使用matplotlib画饼状图
Sep 25 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
python自动生成证件号的方法示例
Jan 14 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
Pycharm中import torch报错的快速解决方法
Mar 05 #Python
Python中私有属性的定义方式
Mar 05 #Python
Python实现AI自动抠图实例解析
Mar 05 #Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 #Python
Python matplotlib修改默认字体的操作
Mar 05 #Python
Django 返回json数据的实现示例
Mar 05 #Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 #Python
You might like
yii框架源码分析之创建controller代码
2011/06/28 PHP
php中使用临时表查询数据的一个例子
2013/02/03 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
javascript遍历控件实例详细解析
2014/01/10 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
Vuex新手的理解与使用详解
2019/05/31 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python基于DES算法加密解密实例
2015/06/03 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
手把手教你python实现SVM算法
2017/12/27 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
python实现猜数游戏
2020/03/27 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
办公室前台岗位职责
2014/01/04 职场文书
工作会议方案
2014/05/21 职场文书
庆七一活动总结
2014/08/27 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
15个值得收藏的JavaScript函数
2021/09/15 Javascript
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android