流畅的python笔记(二十)属性描述符

《流畅的python》读书笔记 《流畅的python》这本书值得推荐,认真读完2篇,对python的理解提高一大截。本书属于python进阶书,不适合入门读物。另外还有2本进阶书《python cookbook》和《Effective Python:编写高质量Python代码的59个有效方法》。下面是本书的读书笔记,其他2本后面陆续补充。 阅读详情

目录

前言

一、描述符示例:验证属性

LineItem类第三版:一个简单的描述符

LineItem类第四版:自动获取储存属性的名称

LineItem类第五版:一种新型描述符

二、覆盖型与非覆盖型描述符对比

覆盖型描述符

没有__get__方法的覆盖型描述符

非覆盖型描述符

在类中覆盖描述符

三、方法是描述符

四、描述符用法建议

五、描述符的文档字符串和覆盖删除操作


前言

描述符是对多个属性运用相同存取逻辑的一种方式。

        描述符是实现了特定协议的类,这个协议包括__get__、__set__和__delete__方法。property类实现了完整的描述符协议。描述符是python的独有特征,不仅在应用层使用,在语言的基础设施中也有用到。

一、描述符示例:验证属性

LineItem类第三版:一个简单的描述符

实现了__get__、__set__、__delete__方法的类是描述符。描述符的用法是,创建一个实例,作为另一个类的类属性。下面例子中,我们将定义一个Quantity描述符类,然后创建两个Quantity实例作为LineItem类的类属性,分别用于管理weight实例属性和price实例属性:

以下是本节常用术语定义:

  • 描述符类,实现描述符协议的类。比如Quantity。
  • 托管类,把描述符类的实例声明为类属性的类,比如LineItem类。
  • 描述符实例,描述符类的各个实例,声明为托管类的类属性。
  • 托管实例,托管类的实例,比如LineItem类的实例。
  • 储存属性,托管实例中存储自身托管属性的属性,比如LineItem实例的weight和price两个实例属性都是储存属性。
  • 托管属性,托管类中由描述符实例处理的公开属性,值存储在储存属性中。

下面是Quantity描述符类和新版LineItem类,用到两个Quantity实例:

  1.  描述符基于协议实现,无需继承某抽象基类。
  2.  Quantity实例中有个storage_name属性,这是托管实例中的储存属性的名称。
  3.  尝试为托管属性赋值时,会调用__set__方法。这里self是描述符实例(即LineItem.weight或LineItem.price),instance是托管实例(LineItem实例),value是要设定的值。
  4. 这里必须直接处理托管实例的__dict__属性,如果使用内置的setattr函数,会再次触发__set__方法,导致无限递归。
  5. 第一个描述符实例绑定给weight属性。
  6. 第二个描述符实例绑定给price属性。

该例中各个托管属性的名称和储存属性一样,而且读值方法不需要特殊的逻辑,所以Quantity类不需要定义__get__方法。

LineItem类第四版:自动获取储存属性的名称

  

如上图左边所示,我们在托管类的定义体中实例化描述符时要输入两次属性的名称,如果能像上图右边那样,自动获取储存属性的名称,即只输入一次,可以让代码更简便。

        为了避免在描述符声明语句中重复输入属性名,我们将为每个Quantity实例的storage_name属性生成一个独一无二的字符串。

 

 

  1. __counter是Quantity类的类属性,统计Quantity实例的数量。
  2. cls是Quantity类的引用。
  3. 每个描述符实例的storage_name属性都是独一无二的,因为其值由描述符类的名称和__counter类属性的当前值构成,中间以#号隔开,如_Quantity#0。
  4. 递增__counter类属性的值。
  5. 需要实现__get__方法,因为托管属性的名称与storage_name不同。
  6. 使用内置的getattr函数从instance中获取储存属性的值。
  7. 使用内置的setattr函数把值存储在instance中,此时储存属性的名称是生成的,即Quantity中的self.storage_name属性,与托管属性的名称weight或price不同了,即我们在托管实例中打了猴子补丁,动态生成了新的属性作为储存属性。
  8. 现在不用把托管属性的名称传给Quantity构造方法。

 描述符在类中定义,因此可以通过继承重用部分代码来创建新描述符。

LineItem类第五版:一种新型描述符

通过继承重用代码来创建新描述符。

 

 

  1.  AutoStorage类提供了之前Quantity描述符类的大部分功能。
  2. 但是在设值方法中没有对值做验证。
  3. Validated是抽象类,不过也继承自AutoStorage类。
  4. __set__方法把验证操作委托给validate方法。
  5. 把验证后的value值传给超类的__set__方法,存储值。
  6. 在这个类中,validate是抽象方法。
  7. Quantity和NonBlank都继承自Validate类。
  8. 要求具体的validate方法返回验证后的值,借此可以清理、转换或规范化接收的数据。

  1.  导入model_v5模块。
  2.  使用model.NonBlank描述符。

以上演示了描述符的典型用途------管理数据属性。这种描述符也叫覆盖型描述符,因为描述符的__set__方法使用托管实例中的同名属性覆盖了要设置的属性。也有非覆盖型描述符。

二、覆盖型与非覆盖型描述符对比

python中存取属性的方式不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但是如果没有指定的实例属性,那么会获取类属性。而为实例中的属性赋值时,如果没有指定的实例属性,则通常会在实例中创建属性,不会影响到类。

        这种存取属性方式的不对等,对描述符也有影响。根据是否定义__set__方法,描述符分为两大类:覆盖型描述符与非覆盖型描述符。

  1.  有__get__和__set__方法的典型覆盖型描述符。
  2.  示例中各个描述符的每个方法都调用了print_args函数。
  3.  没有__get__方法的覆盖型描述符。
  4.  没有__set__方法,因此式非覆盖型描述符。
  5.  托管类,其中使用各个描述符类的一个实例。
  6.  spam方法放在这里是为了对比,因为方法也是描述符。

覆盖型描述符

实现__set__方法的描述符属于覆盖型描述符。因为虽然描述符实例是类属性,但是实现__set__方法的话,会覆盖对实例属性的赋值操作。特性也是覆盖型描述符:如果没有提供设值函数,property类中的__set__方法会抛出AttributeError异常,指明那个属性是只读的。

  1.  创建供测试使用的托管类Managed对象。
  2.  obj.over触发描述符的__get__方法,__get__方法第二个参数instance的值是托管实例obj。
  3.  Managed.over触发描述符的__get__方法,__get__方法第二个参数instance的值是None。
  4.  为obj.over赋值,触发描述符的__set__方法,最后一个参数的值是7。这次赋值肯定是失败的。
  5.  读取obj.over,仍会触发描述符的__get__方法。
  6.  跳过描述符,直接通过obj.__dict__属性设值。
  7.  确认值在obj.__dict__属性中,在over键名下。
  8.  然而,即使是有名为over的实例属性,Managed.over描述符仍会覆盖读取obj.over这个操作。

没有__get__方法的覆盖型描述符

覆盖型描述符也可以只实现__set__方法,此时,只有写操作由描述符处理。因为没有处理读操作的__get__方法,当读取对应属性的时候,实例属性会遮盖描述符。

  1.  这个覆盖型描述符没有__get__方法,因此obj.over_no_get从类中获取描述符实例。
  2.  直接从托管类中获取类属性over_no_get也是直接获取了描述符实例,而不是对应储存属性的值。
  3.  为obj.over_no_get赋值会触发描述符的__set__方法。
  4.  由于我们实现的__set__方法并不修改属性,只是打印一些信息,因此并没有增加新的名为over_no_get的实例属性,因此读取obj.over_no_get获取的仍是托管类中的描述符实例。
  5.  通过实例的__dict__属性设置名为over_no_get的实例属性。
  6.  现在over_no_get实例属性会遮盖描述符,但是只有读操作是如此。
  7.  为obj.over_no_get赋值,仍然是触发描述符的__set__方法。
  8.  读取obj.over_no_get,只要有同名的实例属性,描述符就会被遮盖。

非覆盖型描述符

没有实现__set__方法的描述符是非覆盖型描述符。如果设置了同名的实例属性,再通过对象给指定属性赋值时,描述符会被遮盖。

  1.  obj.non_over触发描述符的__get__方法,第二个参数的值是obj。
  2.  这里会新增一个non_over实例属性,因为Managed.non_over是非覆盖型描述符,因此没有干涉赋值操作的__set__方法。
  3.  obj的实例属性non_over居然把Managed类的同名描述符属性遮盖了!跟我想的不太一样,我还以为描述符只要实现了__get__方法,那么读值的时候描述符就一定会遮盖实例属性。
  4.  通过类来读non_over才会触发__get__方法。
  5.  删除non_over实例属性。
  6.  此时通过托管实例读取non_over时会触发描述符的__get__方法。

覆盖型描述符也叫数据描述符或强制描述符,非覆盖型描述符也叫非数据描述符或遮盖型描述符。

        上述示例中,如果描述符中有__set__,那么通过实例给属性赋值时就会触发__set__方法,如果没有__set__,则会创建一个新的实例属性。即在赋值的时候描述符可以遮盖实例属性,但是我们可以看到,描述符是无法影响类属性的赋值操作的,这也意味着为类属性赋值能覆盖描述符属性。

在类中覆盖描述符

不管描述符是不是覆盖型,为类属性赋值都能覆盖描述符。这是一种猴子补丁技术。

  1. 为后边测试新建实例。
  2. 覆盖类中的描述符属性。
  3. 可以看到所有描述符都已经被覆盖。

三、方法是描述符

在类中定义的函数属于绑定方法(bound method),因为用户定义的函数都有__get__方法,所以依附到类上时,就相当于描述符。因为只有__get__方法,没有__set__方法,因此方法是非覆盖型描述符。是不是因为函数是一等对象,且所有函数类中都有__get__方法,所以当把函数放到类中时,相当于把一个有__get__方法的类的对象放到另一个类中作为类属性,因此,类中定义的函数相当于描述符。

  1.  spam是Managed类中定义的一个实例方法,这里可以看出来obj.spam其本质是一个bound method,即绑定方法。通过实例来访问一个托管属性,会触发描述符实例的__get__方法。
  2.  但是Managed.spam获取的是函数,且地址与上边obj.spam不一样啊。
  3.  通过obj.spam赋值,会遮盖类属性(因为方法是非覆盖型描述符,没有__set__方法,因为通过obj.spam赋值会新建一个实例属性,而通过obj访问时该实例属性会遮盖描述符),导致无法通过obj实例访问spam方法。

从上例可以看出,obj.spam和Managed.spam获取的是不同的对象:

  • 通过托管类访问时,函数的__get__方法会返回自身的引用。
  • 通过实例访问时,函数的__get__方法会返回绑定方法对象,即一种可调用的对象,里面包装着函数,并把托管实例obj绑定给函数的第一个参数。

下面来分析这种机制:

  1.  Text实例的repr方法返回一个类似Text构造方法调用的字符串。
  2.  reverse方法返回反向拼写的单词。
  3.  在类上调用实例方法相当于调用一个普通函数,需要我们手动传入一个Text对象。
  4.  注意类型不同,在类上引用实例方法得到的是function,在实例上引用实例方法得到的是method。
  5.  Text.reverse相当于函数,甚至可以处理Text实例之外的其他对象。
  6.  用类引用实例方法得到的是函数Text.reverse,reverse相当于Text类的类属性,是一个非覆盖型描述符。调用该描述符实例的__get__方法传入Text实例,得到的是绑定到Text实例上的方法。
  7.  调用函数的__get__方法时,如果instance参数的值是None,那么得到的是函数本身。
  8.  word.reverse表达式其实会调用Text.reverse.__get__(word),返回对应的绑定方法。
  9.  绑定方法对象有个__self__属性,其值是调用这个方法的那个实例的引用。
  10.  绑定方法的__func__属性是依附在托管类上那个原始函数的引用。

绑定方法对象还有个__call__方法,这个方法会调用__func__属性引用的原始函数,把函数的第一个参数设为绑定方法对象的__self__属性,这就是形参self的隐式绑定方式。

函数会变成绑定方法,这是python语言底层使用描述符的最好例证。

四、描述符用法建议

  • 使用特性以保持简单。内置的property类创建的其实是覆盖型描述符,__set__方法和__get__方法都实现了。特性的__set__方法默认抛出AttributeError:can't set attribute,因此创建只读属性最简单的方式是使用特性。
  • 只读描述符必须有__set__方法。如果使用描述符类实现只读属性,则__get__和__set__两个方法都必须定义(即定义一个覆盖型描述符),否则实例的同名属性会遮盖描述符。只读属性的__set__方法只需抛出AttributeError异常并提供合适的错误消息。
  • 用于验证的描述符可以只有__set__方法。__set__方法应该检查value参数获得的值,如果有效,使用描述符实例的名称为键,直接在托管实例的__dict__属性中设置。
  • 仅有__get__方法的描述符可以实现高效缓存。如果只实现了__get__方法,那么创建的是非覆盖型描述符。这种描述符可用于执行某些耗费资源的计算,然后为实例设置同名属性,缓存结果。同名实例属性会遮盖描述符,因此后续访问会直接从实例的__dict__是修那个中获取值,而不会再触发描述符的__get__方法。
  • 非特殊的方法可以被实例属性遮盖。由于函数和方法只实现了__get__方法(即非覆盖型描述符),他们不会处理同名实例属性的赋值操作。因此像my_obj.the_method = 7 这样简单赋值之后,后续通过该实例访问the_method得到的是数字7,但是不影响类或者其他实例对the_method的访问。但是,特殊方法不受这个问题的影响,repr(x)执行的其实是x.__class__.__repr__(x),即特殊方法都是通过类来调用的。

五、描述符的文档字符串和覆盖删除操作

描述符类的文档字符串用于注解托管类中的各个描述符实例。

 

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制 本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。 阅读详情

相关推荐

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

属性python_Python属性描述符(一)

描述符是对多个属性运用相同存取逻辑的一种方式,,是实现了特性协议的类,这个协议包括了__get__、__set__和__delete__方法。property类实现了完整的描述符协议。通常,可以只实现部分协议,如只实现了__get__或__set__,而不必把__get__、__set__和__delete__全部实现现在,让我们用描述符协议升级上一个章节Python动态属性和特性(二)的Line...

weixin_39914868的博客 426

在Jetson orin板卡上部署ocr模型遇到错误

摘要:安装ONNX Runtime GPU版本时遇到问题,直接pip install onnxruntime-gpu会报错。解决方案是从test.pypi.org下载对应的.whl文件(如ort_nightly-1.14.0...aarch64.whl),本地安装后还需降级NumPy版本(如pip install numpy==1.26),以解决NumPy版本兼容性问题。整个过程涉及三个关键步骤:下载正确架构的wheel文件、本地安装、调整NumPy版本。

xdxd3c的博客 1526

MySQL查询 -实验

数据库应用技术

qq_70311894的博客 1855

我从华为身上学到的项目管理经验 -- 需求篇

记录这三年,关于项目管理上的一些心得体会 – 需求篇对于需求,我们可以根据不同的角色、理解拆分成三个过程:简单来说就是:需求分析原始需求、 需求拆分为系统需求、 需求实现为功能需求**需求分析**: 将客户需求 输出成 需求描述。 需求经理需要把 需求 转换成 客户能够接受的 初始需求 IR(Initial Requirement) 对于用户来说,我只管提 我的原始需求是

minminzhe520的博客 3万+

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 687

实验1 数据库及表的管理和数据操纵

要求为orders表中userid(客户编号)列创建外键,以保证当要删除和更新account表中的数据时,只要orders表中还有该客户的订单,就拒绝对account表进行的删除和更新操作。INSERT INTO account VALUES ('u0001', '刘晓和', '123456', '男', '广东深圳市', 'liuxh@163.com', '13512345678');4、新进一批金龙鱼一级大豆油5L,数量为50桶,进价为45元,按库存与新进商品的平均值调整商品的成本价格。

qq_68920288的博客 2235

Python无法拒绝的表白界面(完整代码)

Python制作一个无法拒绝的表白界面的完整代码。

AIGC 5万+

第9关:多表查询2

本关任务:显示订单详情表lineitem中所有订单的订单编号orderid,商品名称name和购买数量quantity。 其中lineitem表结构如下: product表结构如下: 相关知识 为了完成本关任务,你需要掌握:select多表查询。 语法 SELECT的查询对象由FROM子句指定,其格式为: FROM 表名1 [ [AS] 别名1 ] [ , 表名2[ [AS] 别名2]] … /查...

qq_46318765的博客 1865

基于四旋翼模型的火箭型无人机视线角保持控制仿真设计

本文针对火箭型无人机的视线角保持控制问题展开研究。基于四旋翼动力学模型,通过改造设计了一种摄像头朝上安装的特殊无人机系统,用于追踪空中目标。文章详细推导了坐标系定义、运动学和动力学方程,重点分析了摄像头安装与视线几何关系,建立了目标运动模型和视线向量计算方法。通过解算期望姿态角,实现了使机体Z轴始终对准目标的控制目标。仿真结果表明,该系统能有效完成视线角保持任务,为空对空监视等应用场景提供了可行方案。~~~~~

huanghm88的专栏 142

Python中的字典(Dictionary)学习

上一章节,我们学习了列表(List) 和 元组(tuple) 来表示有序集合。而我们在讲列表(list)的时候,我们用了列表(list) 来存储用户的姓名。那么如果我们为了方便联系这些童鞋,要把电话号码也添加进去,该怎么做呢?但是这样很不方便,我们把电话号码记录下来,就是为了有什么事能及时联系上这些童鞋。如果用列表来存储这些,列表越长,我们查找起来耗时就越长。

热情、奔放、快乐编程! 503

python中 什么是描述符?

python 描述符

阿常呓语的专栏 2044

Ubuntu18.04安装VCS、Verdi、dve全套教程亲测(有成功截图)

通过下面十个步骤,我们就可以在ubuntu上使用vcs、verdi、dve等软件! 一、安装ubuntu系统,这个不在这里讲了,重点叫安装VCS、Verdi等软件 下面的过程一部分同其他网上流程一致,对其中部分进行修改。如果按照其他网上教程是不会成功的,本人亲测,下面是我试验网上不同文章的流程遇到的错误摸索后总结的流程,按照步骤保证可以成功运行,包括破解流程,使用时间不限制在2020年,可以自定义2030等等。 二、安装文件结构 –synopsys_installer #此程序用于安装下面三个程序。所以你想

QQ_778132974的博客 6364

流畅python学习笔记:第二十章:属性描述符:

在前面一章中介绍了@property的用法,但是存在一个问题,如果我有多个属性想转变成property特性,那不是针对每个都需要实现一个 @propery.setter 和 @property.gettter。这样代码实现太冗余了,而且观感也不好。这一章将介绍如何将这些特性功能单独抽象出来,供各个特性共同使用。作者称这个为特性工厂函数。来看下具体如何实现的 class Quantity...

dianjie9145的博客 149

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

流畅的Python: 属性描述符—验证属性

notes of learning 'Fluent Python' book : just record some of useful info including code.

随心写写 523

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

流畅的Python(二十)-属性描述符

是对多个属性运用的一种方式。其是实现了的类,常见协议包括__get__,__set__,__delete__方法。上一章介绍的就实现了完整的描述符协议。

weixin_37901366的博客 637

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

流畅的python笔记(二十一)类元编程

目录 前言 一、类工厂函数 二、定制描述符的类装饰器 三、导入时和运行时比较 场景练习 场景1解答 场景2解答 四、元类基础知识 场景练习 场景3解答 场景4解答 五、定制描述符的元类 六、元类的特殊方法__prepare__ 七、类作为对象 前言 类元编程是指在运行时创建或定制类的技艺。python中类是一等对象,因此任何时候都可以使用函数新建类,而无需使用class关键字。类装饰器也是函数,不过能够审查、修改甚至把被装饰的类替换成其他类。 最后,元类是...

向上吧贺凯 3129

流畅的python第二十章属性描述符学习记录

描述符是对多个属性运用相同存取逻辑的一种方式。例如,Django ORM 和 SQL Alchemy等 ORM 中的字段类型是描述符,把数据库记录中字段里的数据与 Python 对象的属性对应起来。描述符是实现了特定协议的类,这个协议包括 __get__、__set__ 和 __delete__ 方法。property 类实现了完整的描述符协议。通常,可以只实现部分协议。其实,我们在真实...

anyangyu0343的博客 193

python 属性描述符

文章目录1. 描述符示例:验证属性 learn from 《流畅的python》 1. 描述符示例:验证属性 描述符是对多个属性 运用 相同存取逻辑的一种方式 描述符是实现了 特定协议 的类,这个协议包括 __get__、__set__ 和 __delete__ 方法 property 类实现了完整的描述符协议 实现了 __get__、__set__ 或 __delete__ 方法的类是描述符。描述符 的用法是,创建一个实例,作为另一个类的类属性 class Quantity: def __i

Michael是个半路程序员 673

流畅的Python笔记

比如,要存放 1000 万个浮点数的话,数组(array)的效率要高得多,因为数组在背后存的并不是 float 对象,而是数字的机器翻译,也就是字节表述。构造方法或 [:] 做的是浅复制(即复制了最外层容器,副本中的元素是源容器中元素的引用)。综上,闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。注意,一般来说,深复制不是件简单的事。其实,闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。

ccnuacmhdu的博客 1085

读书笔记:《流畅的Python》第20章 属性描述符

# 第20章 属性描述符 """ 描述符: 是对多个属性运用相同存取逻辑的一种方式 描述符是实现了特定协议的类 包括__get__.__set__.__delete__ property实现了完整的描述符协议 使用描述符的python功能还有staticmethod\classmethod装饰器 理解描述符是精通python的关键 """ # 20.1描述符示例:验证属性 # 20.1.1 LineItem类第三版:一个简单的描述符类 # 实现了__get__..

Morbidmuse的博客 708

[Python] 详解从属性描述符到实现ORM模型

[Python] 详解从属性描述符到实现ORM模型1. 什么是描述符?2. 理解类属性和实例属性访问的不同3. 开始写描述符4. 理解 self、instance 和 owner 参数5. 使用 getattr 和 setattr 替代字典以改写描述符类6. 使用元类注解类的属性7. 用描述符和元类仿照 Django 实现 ORM 模型 1. 什么是描述符? 描述符是对多个属性运用相同存取逻辑的一种方式。例如,Django ORM 和 SQLAlchemy 等 ORM 中的字段类型是描述符,把数据库记录

Spade_的博客 1109

《流畅的python》学习笔记及书评

《流畅的python》学习笔记 文章目录《流畅的python》学习笔记写在前面1. Python数据模型1.1 特殊方法2. 序列构成的数组2.1 内置序列类型2.2 列表推导和生成器表达式2.3 元组不仅仅是不可变的列表2.4 切片2.5 增量赋值2.6 排序2.7 数组、内存视图、NumPy和队列3. 字典和集合3.1 泛映射类型和字典推导3.2 常见的映射方法3.3 映射的弹性键查询3.4 字典的变种3.5 集合3.6 dict和set的背后4. 文本和字节序列4.1 字符和字节4.2 编码和解码4.

李英俊小朋友 2463

《流畅的Python》读书笔记24: 第五部分 元编程 - 属性描述符

描述符(Descriptor)是 Python 中一个强大但常被误解的特性。它允许开发者定义可重用的属性访问逻辑,是许多高级特性(如@property以及__slots__)的底层实现机制。理解描述符将使你对 Python 的对象模型有更深层次的掌握。描述符是一个实现了描述符协议(__get____set____delete__中的一个或多个)的类。描述符的实例可以作为其他类的类属性,从而控制对被管理属性的访问。描述符协议__get____set____delete__方法的作用与签名。

3828

Python描述符的使用

Python描述符的使用 前言 作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍 场景介绍 为了引入描述符的使用,我们先设计一个非常简单的类: class Product(): def __init__(self,name,quantity,price): ...

weixin_34337381的博客 95

流畅的 Python 第二版(GPT 重译)(十二)

property①如果实例没有名为的属性,则获取演讲者对象并将它们存储在那里。②返回。在 示例 22-15 中手动缓存是直接的,但在实例初始化后创建属性会破坏优化,如 “dict 工作原理的实际后果” 中所解释的。根据数据集的大小,内存使用量的差异可能很重要。一个类似的手动解决方案,与键共享优化很好地配合使用,需要为Event类编写一个__init__,以创建必要的并将其初始化为None,然后在speakers方法中检查这一点。参见 示例 22-16。@property。

龙哥盟 1553
上一篇: 流畅的python笔记(十九)动态属性和特性
下一篇: 流畅的python笔记(二十一)类元编程
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值