Python高级用法:描述符(descriptor)

描述符

描述符允许自定义在引用一个对象的属性时应该完成的事情。它是一个类,定义了另一个类的属性的访问方式。换句话说,一个类可以将属性管理委托给另一个类。

描述符类基于3个特殊方法,这3个方法组成了描述符协议(descriptor protocol):

  • __set__(self, obj, type=None):在设置属性时将调用这一方法。在下面的示例中,我们将其称为setter。
  • __get__(self, obj, value):在读取属性时将调用这一方法(被称为getter)。
  • __delete__(self, obj):对属性调用del时将调用这一方法。

实现了__get__()和__set__()的描述符被称为数据描述符(data descriptor)。

如果只实现了__get__(),那么就被称为非数据描述符(non-data descriptor)。

代码实例

class RevealAccess(object):"""一个数据描述符,正常设定值并返回值,同时打印出记录访问的信息。"""def __init__(self, initval=None, name='var'):self.val = initvalself.name = namedef __get__(self, obj, objtype):print('Retrieving', self.name)return self.valdef __set__(self, obj, val):print('Updating', self.name)self.val = valclass MyClass(object):x = RevealAccess(10, 'var "x"')m = MyClass()
m.x
m.x = 20

运行结果为

Retrieving var "x"
Updating var "x"

通过这个例子我们可以看出,当RevealAccess类对象被调用时,触发__get__,当对RevealAccess类对象赋值时触发__set__

延迟求值属性

描述符可以将类属性的初始化延迟到被实例访问时。在属性的初始化依赖全局应用上下文,或者初始化的代价很大,但在导入类的时候不能确保一定会用到这个属性的时候非常有用。

class InitOnAccess:def __init__(self, klass, *args, **kwargs):self.klass = klassself.args = argsself.kwargs = kwargsself._initialized = Nonedef __get__(self, instance, owner):if self._initialized is None:print('initialized!')self._initialized = self.klass(*self.args, **self.kwargs)else:print('cached!')return self._initializedclass MyClass:lazily_initialized = InitOnAccess(list, "argument")m = MyClass()
print(m.lazily_initialized)
print(m.lazily_initialized)

运行结果如下:

initialized!
['a', 'r', 'g', 'u', 'm', 'e', 'n', 't']
cached!
['a', 'r', 'g', 'u', 'm', 'e', 'n', 't']

可以看到只有在访问到InitOnAccess实例化对象时才会初始化,并且只会被初始化一次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala 安装和创建项目

Scala,一种可随您扩展的编程语言:从小型脚本到大型多平台应用程序。Scala不是Java的扩展,但它完全可以与Java互操作。在编译时,Scala文件将转换为Java字节码并在JVM(Java虚拟机)上运行。Scala被设计成面向对…

【JAVA】Iterator 怎么使用?有什么特点

🍎个人博客:个人主页 🏆个人专栏: JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 Iterator 接口的主要方法: 例子 特点: 结语 我的其他博客 前言 在编程的世界里,迭代…

RGB,RGB-D,单目,双目,sterro相机,实例相机介绍

相机—特点及区别 1.相机种类 RGB,RGB-D,单目,双目,sterro相机,实例相机 2.相机特点 2.1单目 只使用一个摄像头进行SLAM,结构简单,成本低 三维空间的二维投影 必须移动相机,才…

DTM分布式事务

DTM分布式事务 从内网看到了关于事务在业务中的讨论,评论区大佬有提及DTM开源项目[https://dtm.pub/],开学开学 基础理论 一、Why DTM ​ 项目产生于实际生产中的问题,涉及订单支付的服务会将所有业务相关逻辑放到一个大的本地事务&#xff…

卷积神经网络|迁移学习-猫狗分类完整代码实现

还记得这篇文章吗?迁移学习|代码实现 在这篇文章中,我们知道了在构建模型时,可以借助一些非常有名的模型,这些模型在ImageNet数据集上早已经得到了检验。 同时torchvision模块也提供了预训练好的模型。我们只需稍作修改&#xf…

【airsim】computer_vision 源码阅读

api文档https://github.com/Microsoft/AirSim/blob/main/docs/image_apis.md#computer-vision-mode capture_ir_segmentation AirSim\PythonClient\computer_vision\capture_ir_segmentation.py 在重新分配分段 ID 后运行。它跟踪感兴趣的物体并记录多旋翼飞行器的红外图像和…

qtday1(2024/1/8)

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QMainWindow(parent) {//设置界面固定大小this->resize(1728,972);this->setFixedSize(1728,972);this->setWindowIcon(QIcon("C:\\Users\\78507\\Desktop\\pic\\qq1.png"));this->…

高级RAG(五):TruLens 评估-扩大和加速LLM应用程序评估

之前我们介绍了,RAGAs评估,今天我们再来介绍另外一款RAG的评估工具:TruLens , trulens是TruEra公司的一款开源软件工具,它可帮助您使用反馈功函数客观地评估基于 LLM 的应用程序的质量和有效性。反馈函数有助于以编程方式评估输入、输出和中间…

vue3 内置组件

文章目录 前言一、过渡效果相关的组件1、Transition2、TransitionGroup 二、状态缓存组件(KeepAlive)三、传送组件(Teleport )四、异步依赖处理组件(Suspense) 前言 在vue3中 其提供了5个内置组件 Transiti…

antv/x6_2.0学习使用(四、边)

一、添加边 节点和边都有共同的基类 Cell,除了从 Cell 继承属性外,还支持以下选项。 属性名类型默认值描述sourceTerminalData-源节点或起始点targetTerminalData-目标节点或目标点verticesPoint.PointLike[]-路径点routerRouterData-路由connectorCon…

猫咪吃哪种猫粮好?主食冻干猫粮哪种性价比高

由于猫咪是肉食动物,对蛋白质的需求很高,如果摄入的蛋白质不足,就会影响猫咪的成长。而冻干猫粮本身因为制作工艺的原因,能保留原有的营养成分和营养元素,所以冻干猫粮蛋白含量比较高,营养又高,…

Python3 集合

集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数创建集合。 创建格…

第二十七周:文献阅读笔记

第二十七周:文献阅读笔记 摘要AbstractDenseNet 网络1. 文献摘要2. 引言3. ResNets4. Dense Block5. Pooling layers6. Implementation Details7. Experiments8. Feature Reuse9. 代码实现 总结 摘要 DenseNet(密集连接网络)是一种深度学习神…

技术总监写的十个方法,让我精通了lambda表达式

技术总监写的十个方法,让我精通了lambda表达式 Collection 转化为 Map使用样例代码展示 Map格式转换转换 Map 的 Value测试样例代码展示 集合类型转化Collection 和 List、Set 的转化测试样例 List、Set 类型之间的转换测试样例 前公司的技术总监写了工具类&#xf…

工智能基础知识总结--词嵌入之FastText

什么是FastText FastText是Facebook于2016年开源的一个词向量计算和文本分类工具,它提出了子词嵌入的方法,试图在词嵌入向量中引入构词信息。一般情况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。 FastText流程 FastText的架…

计算机组成原理简答题

目录 1、指令和数据在计算机内部以几进制存储,又是如何区分的呢? 2、计算机内部为什么要使用二进制? 3、简单描述计算机系统的层次结构 4、DRAM为什么要进行刷新,如何刷新的? 5、简述不同操作码的指令格式&#xf…

常用Java代码-Java中的多线程编程(Multi-threading)

多线程编程是Java中的一个重要概念,它允许程序在同一时刻执行多个任务,提高程序的执行效率和响应性。在Java中,多线程编程通过创建多个线程并利用线程来执行任务实现。 Java提供了Thread类和Runnable接口来实现多线程编程。Thread类是Java中…

FileStream文件管理

文件管理 FileStream:是一个用于读写文件的一个类。它提供了基于流的方式操作文件,可以进行读取、写入、查找和关闭等操作。 第一个参数:path(路径) 相对路径:相对于当前项目的bin目录下的Debug和Realse来…

EMD+包络谱故障诊断

EMD是一种信号处理方法,用于将信号分解成多个本征模态函数(Intrinsic Mode Functions,IMF),每个IMF代表信号中的一个固有振动模式。VMD在处理非平稳信号和非线性信号方面具有较好的性能。 包络谱峭度是一种用于描述信号包络频谱形状的特征。它通过对信号包络谱的谱线斜率…

[嵌入式AI从0开始到入土]10_yolov5在昇腾上应用

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注:等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…