网络编程
位置:首页>> 网络编程>> Python编程>> Python 定义只读属性的实现方式

Python 定义只读属性的实现方式

作者:Daniel2333  发布时间:2023-04-28 01:11:22 

标签: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 <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

来源:https://blog.csdn.net/weixin_35653315/article/details/78077253

0
投稿

猜你喜欢

  • 还是一个关于checkbox的一个普通的效果,就是根据你勾选的checkbox,列出你选择了哪些值演示代码:<!DOCTYPE htm
  •     上周对线上某几个磁盘进行了fio硬盘性能测试,测试完成之后的结果需要绘制成图像展示出来。我在官网上查找
  • 问题描述在电脑中重新安装Anaconda3&PyCharm后,运行原来的程序画图时出现了下图界面。不能弹出如下图所示的“figure”窗口。
  • 前言:过完520,咱们来玩玩五子棋陶冶情操。快拿这个和你女朋友去对线。多的不说直接进入正题人人对战游戏规则:p1为黑子,p2为白子,黑子先手
  • 首先我们知道这个效果应该是一个老话题了。今天整理文件的时候,发现自己以前的一些布局的解决方法躺在文件夹里很长时间了,翻翻老底吧。需要说明的是
  • 为什么要做接口自动化框架1、业务与配置的分离2、数据与程序的分离;数据的变更不影响程序3、有日志功能,实现无人值守4、自动发送测试报告5、不
  • 终于下决心把python从2.7升到了3.7。懒人安装当然使用Anaconda。安装成功,编译成功。但是用pip 安装包的时候提示:pip
  • 自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,st
  • //-------------------------------------------- // 删除千分点。 //-----------
  • 目录深度遍历递归用栈来遍历磁盘广度遍历磁盘用队列遍历磁盘深度遍历递归import osdef get_files(path):  
  • import httplibimport osimport timedef check_http(i):   
  • 笔主在做一个项目要生成一组随机有序的整型数字,并按行输出到文本文件使用,恰好开始学习Python3,遂决定直接使用Python3解决思路:与
  • 1 np.arange(),类似于range,通过指定开始值,终值和步长来创建表示等差数列的一维数组,注意该函数和range一样结果不包含终
  • 如果你想让你的IIS支持wml,做个wap网站,只需作小小的改变就行了.虽然目前支持wml的虚拟主机极少,但是自己在本机上玩玩也好的.首先在
  • 一、绘图命令操纵海龟绘图有很多命令,可以划分为三种:画笔运动命令、画笔控制命令、全局控制命令1、画笔运动命令命令说明turtle.forwa
  • keras中卷积层Conv2D的学习关于卷积的具体操作不细讲,本文只是自己太懒了不想记手写笔记。由于自己接触到的都是图像处理相关的工作,因此
  • 今天 大白 问了一个关于CSS权重的问题:关于选择器权重的问题 。class的权重是10 标签权重是 1 。比如说 p span{} 权重是
  • 本文实例讲述了python飞机大战pygame碰撞检测实现方法。分享给大家供大家参考,具体如下:目标了解碰撞检测方法碰撞实现01. 了解碰撞
  • 近日,朋友写一个关于成绩管理的系统,其中遇到一个小问题。如果按照SQLSERVER的ORDER 排序时,比如遇到两个100分,结果必然是名次
  • 本文实例讲述了JavaScript数据结构中串的表示与应用。分享给大家供大家参考,具体如下:类似于线性表的顺序存储结构,用一组地址连续的存储
手机版 网络编程 asp之家 www.aspxhome.com