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 01 Python
python使用nntp读取新闻组内容的方法
May 08 Python
Python中list列表的一些进阶使用方法介绍
Aug 15 Python
Scrapy的简单使用教程
Oct 24 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
python 删除非空文件夹的实例
Apr 26 Python
记录Python脚本的运行日志的方法
Jun 05 Python
python输入多行字符串的方法总结
Jul 02 Python
python实现简单飞行棋
Feb 06 Python
python属于跨平台语言码
Jun 09 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 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
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
php创建类并调用的实例方法
2019/09/25 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
Python实现删除文件但保留指定文件
2015/06/21 Python
python框架中flask知识点总结
2018/08/17 Python
Python Django view 两种return的实现方式
2020/03/16 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python设置中文界面实例方法
2020/10/27 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
你对IPv6了解程度
2016/02/09 面试题
体育运动口号
2014/06/09 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
六年级小学生评语
2014/12/26 职场文书
给老婆的道歉信
2015/01/20 职场文书
应届生简历自我评价
2015/03/11 职场文书
医院病假条怎么写
2015/08/17 职场文书