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分割文件的常用方法
Nov 01 Python
详解Python中列表和元祖的使用方法
Apr 25 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
Python3 replace()函数使用方法
Mar 19 Python
pandas数据分组和聚合操作方法
Apr 11 Python
django的settings中设置中文支持的实现
Apr 28 Python
python Web flask 视图内容和模板实现代码
Aug 23 Python
python向企业微信发送文字和图片消息的示例
Sep 28 Python
Django如何实现防止XSS攻击
Oct 13 Python
python实现xml转json文件的示例代码
Dec 30 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 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
PHP读取Excel类文件
2017/05/15 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
Python处理字符串之isspace()方法的使用
2015/05/19 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
python数据分析:关键字提取方式
2020/02/24 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
小学安全汇报材料
2014/08/14 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
实践论读书笔记
2015/06/29 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
Pandas 稀疏数据结构的实现
2021/07/25 Python
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android