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的Django框架使用
Feb 18 Python
利用Python破解验证码实例详解
Dec 08 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
pycharm显示远程图片的实现
Nov 04 Python
详解python with 上下文管理器
Sep 02 Python
python matplotlib绘制三维图的示例
Sep 24 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
python中if嵌套命令实例讲解
Feb 25 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定时更新程序设计思路分享
2014/06/10 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php上传文件常见问题总结
2015/02/03 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
javascript 写类方式之二
2009/07/05 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
删除节点的jquery代码
2014/01/13 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
工作决心书范文
2014/03/11 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
优秀校长事迹材料
2014/12/24 职场文书
客房部经理岗位职责
2015/02/02 职场文书
使用Apache Camel表达REST服务的方法
2022/06/10 Servers
keepalived + nginx 实现高可用方案
2022/12/24 Servers