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

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

第三章:类与继承(总结)

第22条:尽量用辅助类来维护程序的状态,而不要用字典和元组

总结:
1.如果我们使用字典或元组保存程序的某部分信息,但随着需求的不断变化,需要逐渐的修改之前定义好的字典或元组结构,会出现多次的嵌套,过分膨胀会导致代码出现问题,而且难以理解。遇到这样的情况,我们可以把嵌套结构重构为类。
2.避免字典中嵌套字典,或者长度较大的元组。
3.如果保存内部状态的字典变得比较复杂,应该拆解为多个辅助类。

第23条:简单的接口应该接受函数,而不是类的实例

Python中的许多内置的API都允许你通过向函数传递参数来自定义行为。这些被API使用的hooks将会在它们运行的时候回调给你的代码。

总结:
1.对于连接各种python组件的简单接口来说,通常应该给其直接传入函数,而不是先定义某个类,然后再传入该类的实例
2.Python中的函数和方法可以像类那么引用,因此,它们与其他类型的对象一样,也能够放在表达式里面
3.通过名为__call__的特殊方法,可以使类的实例能够像普通的Python函数那样得到调用

第24条:以@classmethod形式的多态去通用的构建对象

在python中,不仅对象支持多态,类也支持多态

总结:
1.在Python程序中,每个类只能有一个构造器,也就是__init__方法,一般只用 _init_ 方法,不够用的时候可以用这个方法添加构造器。
2.通过@classmethod机制,可以用一种与构造器相仿的方式来构造类的对象
3.通过类方法机制,我们能够以更加通用的方式来构建并拼接具体的子类

第25条:用super初始化父类

多重继承情况下,直接调用父类进行初始化可能会出现冲突,super() 经过特殊处理,可以根据方法解析顺序进行初始化。
MRO即为方法解析顺序,以标准的流程来安排超类之间的初始化顺序,深度优先,从左至右,它也保证最上层的那个公共基类的__init__方法只会运行一次

总结:
1.总是应该使用内置的super函数来初始化父类。

第26条:只在使用Mix-in组建制作工具类时进行多重继承

本条告诉我们尽量不要使用多重继承,能用mix-in组件实现的效果,就不要使用多重继承来做。

总结:多用组合,少用继承

第27条:多用pubilc属性,少用private属性

Python中没有真正的私有,理论上说,Python 中的类属性前加两个下划线就是私有属性,使用者没法直接调用。但如果确实要调用,也有绕过规则的办法,所以,Python 的私有属性是不严格的。

总结:
1.python没有从语法上严格保证private字段的私密性
2.不要盲目将属性设置为 private,而是应该从一开始就做好规划,并允子类更多地访问超类的内部的API
3.应该更多的使用protected属性,并在文档中把这些字段的合理用法告诉子类的开发者,而不是试图用private属性来限制子类访问这些字段
4.只有当子类不受自己控制的时候,才可以考虑使用 private 属性来避免名称冲突

第28条:继承collections.abc以实现自定义的容器类型

collections.abc模块定义了一系列抽象基类,它们提供了每一种容器类型所应具备的常用方法,大家可以自己参考源码
本条建议我们:简单的容器还是直接继承 Python 的容器类型,比如列表或字典,比较复杂时可以继承抽象基类,主要理由是可以少写一些方法,还提高了代码整洁性。

总结:
1.如果要定制的子类比较简单,那就可以直接从Python的容器类型(如list或dict)中继承
2.想正确实现自定义的容器类型,可能需要编写大量的特殊方法
3.编写自制的容器类型时,可以从collection.abc 模块的抽象类基类中继承,那些基类能确保我们的子类具备适当的接口及行为

在这里插入图片描述
第三章:类与继承(完)
下章见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值