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发送邮件示例(支持中文邮件标题)
Feb 16 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
matplotlib简介,安装和简单实例代码
Dec 26 Python
Python 查看文件的读写权限方法
Jan 23 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
python实现电子产品商店
Feb 26 Python
Python Collatz序列实现过程解析
Oct 12 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
Python Flask异步发送邮件实现方法解析
Aug 01 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维护文件系统
2006/10/09 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
php异常处理捕获错误整理
2019/09/23 PHP
js 链式延迟执行DOME
2012/01/04 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
使用Pycharm分段执行代码
2020/04/15 Python
python中for in的用法详解
2020/04/17 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
销售部主管岗位职责
2013/12/18 职场文书
《去年的树》教学反思
2014/04/11 职场文书
农村党员一句话承诺
2014/05/30 职场文书
六一亲子活动总结
2014/07/01 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
2014年基建工作总结
2014/12/12 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
横空出世观后感
2015/06/09 职场文书
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS