python只读属性怎么设置_Python 定义只读属性的实现方式

Python是面向对象(OOP)的语言, 而且在OOP这条路上比Java走得更彻底, 因为在Python里, 一切皆对象, 包括int, float等基本数据类型.

在Java里, 若要为一个类定义只读的属性, 只需要将目标属性用private修饰, 然后只提供getter()而不提供setter(). 但Python没有private关键字, 如何定义只读属性呢? 有两种方法, 第一种跟Java类似, 通过定义私有属性实现. 第二种是通过__setattr__.

通过私有属性

Python里定义私有属性的方法见 https://www.jb51.net/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

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

obj.readonly_property = 1

...

AttributeError: MyCls.readonly_property is READ ONLY

以上这篇Python 定义只读属性的实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: Python 定义只读属性的实现方式

本文地址: http://www.cppcns.com/jiaoben/python/302219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值