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使用calendar输出指定年份全年日历的方法
Apr 04 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
python实现随机加减法生成器
Feb 24 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 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服务器实现多session并发运行
2006/10/09 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
php中使用websocket详解
2016/09/23 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
python使用opencv进行人脸识别
2017/04/07 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python列表list操作相关知识小结
2020/01/29 Python
使用Python操作MySQL的小技巧
2020/09/10 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
入党积极分子介绍信
2014/01/17 职场文书
四年级语文教学反思
2014/02/05 职场文书
促销活动总结范文
2014/04/30 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis