Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)

abc:Abstract Base Class

这里的抽象基类,类似于java中的接口,java中是无法实现多继承的,即java只能继承一个类,但是它可以继承多个接口;接口不能用来实例化的,因此,python终端抽象基类也是不可用实例化的。

Python是动态语言,是没有变量的类型的,在python中,变量只是一个符号而已,它是可以指向任何类型的对象,因此python中也不存在多态这个概念。

我们可以赋值任何数据给python中的变量,而且它是可修改的,因此不需要像java那样实现多态,因为从语言本身而言,已经是一个支持多台的语言。

python是动态语言:不需要指明变量的类型。因此动态语言也少了一个编译时检查错误的环节。

python中如果写错代码,事先是很难知道的,只有在运行的时候才会发现错误,这也是动态语言共有的一个缺陷,无法做类型检查。

python信奉的是鸭子类型,它与java最大的区别,在实现class时,不需要继承指定的类型

一个类到底是什么类型,是看里面实现了什么魔法函数,不同的魔法函数就赋予了类不同的特性

鸭子类型与魔法函数,构成了python语言的基础,python不是继承某一类或某一接口就具有某些特性,只需要实现指定的魔法函数,类就是某种类型的对象。不同的魔法函数具有的特性,在python中叫做协议。

编程时,尽量遵从python协议,这样写出来的代码才是足够pythonic的代码

抽象基类:在这个基础的类中,我们去设定一些方法,然后所有的继承基类的类都必须必须覆盖抽象基类里面的方法

抽象基类是无法用来实例化的

Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第1张图片

 Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第2张图片

Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第3张图片

Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第4张图片

此处,由于没有在子类继承中重新定义set方法,因此抛出异常

如果重新定义了实现子类的方法,则不再抛出异常

Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第5张图片

上面模拟抽象基类的方法,不好之处在于,在调用set这个抽象基类的方法的时候才抛出异常,如何实现在初始化的时候就抛出异常? 这里就需要导入abc模块,全局下面的abc

Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第6张图片

此时,在初始化的时候就提醒,必须重载set与get的方法。

Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第7张图片

这里,只重载set方法,则会提醒抽象方法get没有实现。

采用抽象基类,在初始化时,就强制实现某些方法

在python中实际上已经实现了一些通用的抽象基类,让我们了解python数据基类的一些接口。它放在collections.abc模块中。

Python 高级编程和异步IO并发编程 --04_2 抽象基类(abc模块)_第8张图片

判定b是不是A的类型

抽象基类:

1. 去调用isinstance

2. 做接口的强制规定

抽象基类并不是非常推荐使用的,实际上有很多其它的方法。

尽量使用鸭子类型,如果一定继承某些接口,推荐使用mixin,多继承的方式去实现。

抽象基类使用时,很容易设计过渡,不容易理解。

希望shiy

 

你可能感兴趣的:(Python高级编程)