Python 定义只读属性的实现方式
Python是面向对象(OOP)的语言,而且在OOP这条路上比Java走得更彻底,因为在Python里,一切皆对象,包括int,float等基本数据类型.
在Java里,若要为一个类定义只读的属性,只需要将目标属性用private修饰,然后只提供getter()而不提供setter().但Python没有private关键字,如何定义只读属性呢?有两种方法,第一种跟Java类似,通过定义私有属性实现.第二种是通过__setattr__.
通过私有属性
Python里定义私有属性的方法见https://www.nhooo.com/article/181953.htm.
用私有属性+@property定义只读属性,需要预先定义好属性名,然后实现对应的getter方法.
classVector2D(object): def__init__(self,x,y): self.__x=float(x) self.__y=float(y) @property defx(self): returnself.__x @property defy(self): returnself.__y if__name__=="__main__": v=Vector2D(3,4) print(v.x,v.y) v.x=8#errorwillberaised.
输出:
(3.0,4.0) Traceback(mostrecentcalllast): File....,line16,inv.x=8#errorwillberaised. AttributeError:can'tsetattribute
可以看出,属性x是可读但不可写的.
通过__setattr__
当我们调用obj.attr=value时发生了什么?
很简单,调用了obj的__setattr__方法.可通过以下代码验证:
classMyCls(): 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 classMyCls(object): readonly_property='readonly_property' def__init__(self): pass def__setattr__(self,f,v): iff=='readonly_property': raiseAttributeError('{}.{}isREADONLY'.\ 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(mostrecentcalllast): File"...",line21,inobj.readonly_property=1 ... AttributeError:MyCls.readonly_propertyisREADONLY
以上这篇Python定义只读属性的实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。