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 相关文章推荐
如何搜索查找并解决Django相关的问题
Jun 30 Python
python对excel文档去重及求和的实例
Apr 18 Python
python实时监控cpu小工具
Jun 21 Python
Python常见内置高效率函数用法示例
Jul 31 Python
python多线程抽象编程模型详解
Mar 20 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
Python进度条的制作代码实例
Aug 31 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
python - timeit 时间模块
Apr 06 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
分享10段PHP常用代码
2015/11/11 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
List all the Databases on a SQL Server
2007/06/21 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
Angularjs的启动过程分析
2017/07/18 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
python解决字典中的值是列表问题的方法
2013/03/04 Python
python批量同步web服务器代码核心程序
2014/09/01 Python
Python线性回归实战分析
2018/02/01 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
python中turtle库的简单使用教程
2020/11/11 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
Gap英国官网:Gap UK
2018/07/18 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
网游商务专员求职信
2013/10/15 职场文书
关于礼仪的演讲稿
2014/01/04 职场文书
走进敬老院活动总结
2014/07/10 职场文书
员工辞职信范文大全
2015/05/12 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python