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插入排序算法实例分析
Jul 03 Python
Python网络编程中urllib2模块的用法总结
Jul 12 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
python破解zip加密文件的方法
May 31 Python
对Python 数组的切片操作详解
Jul 02 Python
python批量获取html内body内容的实例
Jan 02 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
Django Rest framework解析器和渲染器详解
Jul 25 Python
Django RBAC权限管理设计过程详解
Aug 06 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
python实现QQ邮箱发送邮件
Mar 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 access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
document.write的几点使用心得
2014/05/14 Javascript
js给selected添加options的方法
2015/05/06 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
python中ConfigParse模块的用法
2014/09/29 Python
Python中的类与对象之描述符详解
2015/03/27 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
python 默认参数相关知识详解
2019/09/18 Python
基于Python解密仿射密码
2019/10/21 Python
Python中私有属性的定义方式
2020/03/05 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
列车长先进事迹材料
2014/01/25 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
战友聚会主持词
2014/04/02 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android