描述符用法建议

下面根据刚刚论述的描述符特征给出一些实用的结论。
使用特性以保持简单
内置的 property 类创建的其实是覆盖型描述符,__set__ 方法和
__get__ 方法都实现了,即便不定义设值方法也是如此。特性的
__set__ 方法默认抛出 AttributeError: can’t set attribute,
因此创建只读属性最简单的方式是使用特性,这能避免下一条所述的问
题。

只读描述符必须有__set__方法
如果使用描述符类实现只读属性,要记住,__get____set__
两个方法必须都定义,否则,实例的同名属性会遮盖描述符。只读属性
__set__ 方法只需抛出 AttributeError 异常,并提供合适的错误
消息。

用于验证的描述符可以只有 __set__ 方法
对仅用于验证的描述符来说,__set__ 方法应该检查 value 参数
获得的值,如果有效,使用描述符实例的名称为键,直接在实例的
__dict__ 属性中设置。这样,从实例中读取同名属性的速度很快,因
为不用经过 __get__ 方法处理。参见示例 20-1 中的代码。

仅有 __get__ 方法的描述符可以实现高效缓存
如果只编写了 __get__ 方法,那么创建的是非覆盖型描述符。这
种描述符可用于执行某些耗费资源的计算,然后为实例设置同名属性,
缓存结果。同名实例属性会遮盖描述符,因此后续访问会直接从实例的__dict__ 属性中获取值,而不会再触发描述符的 __get__ 方法。

非特殊的方法可以被实例属性遮盖

由于函数和方法只实现了 __get__ 方法,它们不会处理同名实例
属性的赋值操作。因此,像 my_obj.the_method = 7 这样简单赋值之
后,后续通过该实例访问 the_method 得到的是数字 7——但是不影响
类或其他实例。然而,特殊方法不受这个问题的影响。解释器只会在类
中寻找特殊的方法,也就是说,repr(x) 执行的其实是
x.__class__.__repr__(x),因此 x 的__repr__属性对 repr(x) 方
法调用没有影响。出于同样的原因,实例的 __getattr__ 属性不会破
坏常规的属性访问规则。

实例的非特殊方法可以被轻松地覆盖,这听起来不可靠且容易出错,可
是在我使用 Python 的 15 年中从未受此困扰。然而,如果要创建大量动
态属性,属性名称从不受自己控制的数据中获取(像本章前面那样),
那么你应该知道这种行为;或许你还可以实现某种机制,过滤或转义动
态属性的名称,以维持数据的健全性。

示例 19-6 中的 FrozenJSON 类不会出现实例属性遮盖方法的
问题,因为那个类只有几个特殊方法和一个 build 类方法。只要
通过类访问,类方法就是安全的,在示例 19-6 中我就是这么调用
FrozenJSON.build 方法的——在示例 19-7 中替换成 __new__
法了。Record 类(见示例 19-9 和示例 19-11)及其子类也是安全
的,因为只用到了特殊的方法、类方法、静态方法和特性。特性是
数据描述符,因此不能被实例属性覆盖。

讨论特性时讲了两个功能,这里讨论的描述符还未涉及,结束本章之前
我们来讲讲:文档和对删除托管属性的处理。

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

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

相关文章

Milvus 向量数据库内存使用相关了解

1、支持 MMap 的数据存储在 Milvus 中,内存映射文件允许将文件内容直接映射到内存中。这一功能提高了内存效率,尤其是在可用内存稀缺但完全加载数据不可行的情况下。这种优化机制可以增加数据容量,同时在一定限度内确保性能;但当数…

C++编程之旅-- -- --默认成员函数(全详解)

目录前言构造函数构造函数形式:构造函数的特性:explicit关键字析构函数析构函数的概念析构函数的特性含有类类型的成员变量的类析构函数的调用拷贝构造函数拷贝构造函数的概念拷贝构造函数的特性浅拷贝和深拷贝:拷贝构造函数典型调用场景&…

Linux网络编程:TCP的远程多线程命令执行

目录 前言: 一、前文补充 二、服务端的修改 三、Command类的新增 前言: 好久不见,最近忙于其他事情,就耽误了咱们的Linux的网络部分的学习。 今天咱们先来给之前所学的TCP的部分进行一个首尾工作,主要是给大家介绍…

重学React(三):状态管理

背景: 继续跟着官网的流程往后学,之前已经整理了描述UI以及添加交互两个模块,总体来说还是收获不小的,至少我一个表面上用了四五年React的前端小卡拉米对React的使用都有了新的认知。接下来就到了状态管理(React特地加…

java web项目入门了解

目录一、项目流程1. 使用servle2. 使用框架二、了解java web项目构造1. 项目目录结构2. 查看页面访问顺序3. 发起请求:jqueryajax4. 接受参数5. JSONJSON 数组三、get和post请求区别一、项目流程 1. 使用servle 有客户端和服务端,客户端和服务端进行交…

网络资源模板--基于Android Studio 实现的日记本App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情(部分) 创建修改页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也可…

GO的启动流程(GMP模型/内存)

目录第一部分:程序编译第二部分:函数解读1)Golang 核心初始化过程2)创建第一个协程3)启动系统调度4)跳转main函数5)总结第三部分:GMP模型Goroutine流程解读第四部分:内存…

OLTP与OLAP:实时处理与深度分析的较量

OLTP(Online Transaction Processing)定义:OLTP 系统主要用于管理事务性应用程序的数据。这类系统需要支持大量的短时、快速的交互式事务,比如银行交易、在线购物订单等。特点:实时处理:OLTP 系统要求对数据…

数据安全与隐私保护:企业级防护策略与技术实现

引言:数据安全的新时代挑战在数字化转型加速的今天,数据已成为企业最核心的资产。然而,数据泄露事件频发,据 IBM《2024 年数据泄露成本报告》显示,全球数据泄露平均成本已达445 万美元,较 2020 年增长了 15…

AI_RAG

一.为什么需要RAG(AI幻觉)大模型LLM在某些情况下给出的回答很可能错误的,涉及虚构甚至是故意欺骗的信息。二.什么是RAGRAG是一种结合“信息检索”和“文本生成”的技术,旨在提升生成式AI模型的准确性和可靠性。它通过以下两个核心…

LeetCode111~130题解

LeetCode111.二叉树的最小深度: 题目描述: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root …

n8n飞书webhook配置(飞书机器人、飞书bot、feishu bot)Crypto节点、js timestamp代码、Crypto node

自定义机器人使用指南 利用 n8n 打造飞书 RSS 推送机器人 文章目录自定义机器人使用指南注意事项功能介绍在群组中添加自定义机器人操作步骤邀请自定义机器人进群。- 进入目标群组,在群组右上角点击更多按钮,并点击 设置。- 在右侧 设置 界面&#xff0…

nhdeep档案管理工具软件官网

欢迎访问nhdeep官网: www.nhdeep.com NHDEEP提供一系列专业的单机版档案管理工具,满足不同场景下的档案管理需求,无需网络连接,数据安全可靠。所有工具均提供免费试用版下载。 档案综合管理系统单机版:全面的档案管理解决方案&a…

RocketMQ节点部署计算方案

节点计算公式 业务场景 预期峰值TPS:200,000 单组容量:40K TPS 容灾要求:同城双机房 nameServer节点数max(3, (15/50) 1) max(3, 0.3 1) max(3, 1.3) 3 Broker节点数ceil(200,000 / 40,000) 5组 总节点数 NameServer节点Broker组数(Mas…

MyBatis联合查询 - XML篇

文章目录数据库设计MyBatis 配置MyBatis 映射文件Mapper 接口总结数据库设计 建表 SQL CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL );CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(…

Kubelet 探针如何选择 IP:status.PodIP 溯源与“同 Pod 两个 IP“现象解析

背景与现象同一个 Pod 的 readiness 和 liveness 探针日志显示连接的 IP 不一致(例如 10.10.6.10:9999 与 10.10.6.32:9999)。本文从 kubelet 源码入手,解释探针目标 IP 的来源、为何会出现两个不同 IP,并给出建议与验证方法。在如…

Arm Development Studio 安全通告:CVE-2025-7427

安全之安全(security)博客目录导读 目录 一、概述 二、CVE 详情 三、受影响产品 四、建议 五、致谢 六、版本历史 一、概述 ARM已知悉一个影响 Arm Development Studio 的安全漏洞,该漏洞可能允许攻击者执行 DLL 劫持攻击(DLL hijacking attack&…

C#异步编程双利器:异步Lambda与BackgroundWorker实战解析

**摘要:**深入剖析两种异步编程范式,解决GUI线程阻塞难题 一、异步Lambda表达式:事件处理的轻量化利器 核心价值:简化事件响应中的异步操作,避免UI线程阻塞 ✅ 典型应用场景(WPF示例)&#xff1…

yolo world (1): 论文解读

YOLO 系列检测器以其高效性和实用性而闻名。然而,它们依赖于预定义和训练的目标类别,这限制了其在开放场景中的适用性。为了解决这一限制,我们提出了 YOLO-World,这是一种创新的方法,通过视觉-语言建模和大规模数据集预训练,增强了 YOLO 的开放词汇检测能力。具体来说,我…

【JVM】深入解析Java虚拟机

目录 1. 区分JDK,JRE 和 JVM 1.1 JVM 1.2 JRE 1.3 JDK 1.4 关系总结 2. 跨平台性 3. JVM中的内存划分 4. JVM的类加载机制 5. 双亲委派模型 6. 垃圾回收机制(GC) 6.1 识别垃圾 6.1.1 单个引用 6.1.2 多个引用 6.2 释放垃圾 6.…