《Effective Python 编写高质量Python代码的59个有效方法》第四章(共八章)阅读总结

本文是对《Effective Python》第四章的阅读总结,主要讨论了如何使用Python的元类、属性进行更高效和优雅的编程。包括用纯属性替代get和set方法,使用@property重构属性,利用描述符类复用@property,通过__getattr__、__getattribute__和__setattr__实现动态属性,以及元类在验证子类、注册子类和注解类属性中的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述
年纪大了,记性不好,老忘,所以在读完这本书后写了这一系列文章,文章中没有任何书中的示例代码,只是对每条知识点的总结。写给自己看,分享给大家看,不足之处欢迎指正。

第四章:元类及属性(总结)

第29条:用纯属性取代get和set方法

从其他语言转入Python的开发者,可能会在类中明确的实现getter和setter方法,作者是从Java转入Python的感受尤为明显。getter和setter用起来虽然简单但不是Python的编程风格。

总结:
1.编写新类时,应该用简单的public属性来定义其接口,而不要手工实现set和get方法
2.如果访问对象的某个属性,需要表现出特殊的行为,那就用@property来定义这种行为
3.@property 方法应该遵循最小惊讶原则,而不应该产生奇怪的副作用
4.确保@property方法是执行迅速的,如果是慢或者复杂的工作应该放在普通的方法里面

第30条:考虑用@property来代替属性重构

本条的意思是:取消旧属性的时候,可以考虑用这个修饰器来支持调用原来的类的旧代码继续运作

总结:当我们对属性的需求发生变化的时候,我们只需要给本类添加新的功能,原来的那些调用代码都不需要改变,它在持续完善接口的过程中是一种重要的缓冲方案,但是,如果@property用的太过频繁,就应该考虑彻底重构该类并修改相应的调用代码

第31条:用描述符类改写需要复用的@property方法

总结:
1.如果想复用 @property 方法及其验证机制,那么可以自定义描述符类
2.WeakKeyDictionary 可以保证描述符类不会泄露内存
3.通过描述符协议来实现属性的获取和设置操作时,不要纠结于__getatttttribute__ 的方法的具体运作细节

第32条:用__getattr__、__getattribute__和__setattr__实现按需生成的属性

这个地方需要注意,长相上看__getattr__和__setattr__比较像,但__getattr__ 是在检查实例字典,并且没有找到对应值之后才调用的,而__getattribute__ 和__setattr__则会一开始就调用,所以谁和谁是一对比较让人费解。

总结:
1.通过__getattr__和__setattr__,我们可以用惰性的方式来加载并保存对象的属性
2.要理解__getattr__和__getattribute__的区别:前者只会在待访问的属性缺失时触发,,而后者则会在每次访问属性时触发
3.如果要在__getattribute__和__setattr__方法中访问实例属性,那么应该直接通过super()来做,以避免无限递归

第33条:用元类来验证子类

元类最简单的一种用途,就是验证某个类定义的是否正确,构建复杂的类体系时,我们可能需要确保类的风格协调一致,确保某些方法得到了覆写,或是确保类属性之间具备某些严格的关系。
这里引用Tim Peters的一句话:"(元类)是深奥的知识,99%的用户都无需关注。如果你想知道是否需要使用元类,我告诉你,不需要(真正需要使用元类的人确信他们需要,无需解释原因)"。
意思就是:你不需要关注元类,也不需要知道是否使用元类,当你真正需要用它的时候你就会知道!

总结:
1.通过元类,我们可以在生成子类对象之前,先验证子类的定义是否合乎规范
2.Python2 和 Python3 指定元类的语法略有不同
3.Python 系统把子类的整个 class 语句体处理完毕之后,就会调用其元类的__new__ 方法

第34条:用元类来注册子类

元类还有一个用途就是在程序中自动注册类型,对于需要反向查找(reverse lookup)的场合,这种注册操作很有用。

总结:
1.在构建模块化的 Python 程序时候,类的注册是一种很有用的模式
2.开发者每次从基类中继承子类的时,基类的元类都可以自动运行注册代码
3.通过元类来实现类的注册,可以确保所有子类都不会泄露,从而避免后续的错误

第35条:用元类来注解类的属性

元类还有一个更有用的功能,那就是可以在某个类刚好定义好但是尚未使用的时候,提前修改或注解该类的属性。

总结:
1.借助元类,我们可以在某个类完全定义好之前,率先修改该类的属性
2.描述符与元类能够有效的组合起来,以便对某种行为做出修饰,或者在程序运行时探查相关信息
3.如果把元类与描述符相结合,那就可以在不使用 weakerf 模块的前提下避免内存泄露

在这里插入图片描述

第四章:元类及属性(完)
下章见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值