《流畅的Python》第十一章学习笔记


不建议编写抽象基类,容易过度设计

抽象基类与描述符和元类一样,是用于构建框架的工具

一个类可能实现多个接口,从而让实例扮演多个角色。

协议是接口,但不是正式的,因此协议不能像正式接口那样施加限制。一个类可能只实现部分接口。

猴子补丁

Python是动态语言,所以可以在运行时进行修正

class A:
    def f(self):
        pass


def f(a):
    return 'Hello World'


if __name__ == '__main__':
    A.f = f
    a = A()
    print(a.f())

在运行过程中修改类Af方法

鸭子类型

忽略对象的真正类型,转而关注对象有没有实现所需的方法、签名和语义。

在框架之外,鸭子类型通常比类型检查更简单,也更灵活

抽象基类

collections.abc中有很多有用的抽象类

Python的抽象基类可以使用register类方法在终端用户的代码中把某个类「声明」为一个抽象基类的「虚拟」子类。

让解释器把调用分派给正确的方法,而不是if/elif/else块硬编码分派逻辑

抽象基类是用于封装框架引入的一般性概念和抽象。基本上不需要自己编写新的抽象基类,只要正确使用现有的抽象基类就能获得99.9%的好处,而不用冒着设计不当导致的巨大风险。

容器抽象基类

注意:与其他方法描述符一起使用时,abstractmethod需要放在最里面

虚拟子类

即便不继承,也有办法把一个类注册为抽象基类的虚拟子类。

注册虚拟子类的方法是在抽象基类上调用register方法。issubclassisinstance等函数都能识别,但是注册的类不会从抽象基类中继承任何方法或属性。

为了避免运行错误,虚拟子类需要实现所需的全部方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值