abc:Abstract Base Class
这里的抽象基类,类似于java中的接口,java中是无法实现多继承的,即java只能继承一个类,但是它可以继承多个接口;接口不能用来实例化的,因此,python终端抽象基类也是不可用实例化的。
Python是动态语言,是没有变量的类型的,在python中,变量只是一个符号而已,它是可以指向任何类型的对象,因此python中也不存在多态这个概念。
我们可以赋值任何数据给python中的变量,而且它是可修改的,因此不需要像java那样实现多态,因为从语言本身而言,已经是一个支持多台的语言。
python是动态语言:不需要指明变量的类型。因此动态语言也少了一个编译时检查错误的环节。
python中如果写错代码,事先是很难知道的,只有在运行的时候才会发现错误,这也是动态语言共有的一个缺陷,无法做类型检查。
python信奉的是鸭子类型,它与java最大的区别,在实现class时,不需要继承指定的类型
一个类到底是什么类型,是看里面实现了什么魔法函数,不同的魔法函数就赋予了类不同的特性
鸭子类型与魔法函数,构成了python语言的基础,python不是继承某一类或某一接口就具有某些特性,只需要实现指定的魔法函数,类就是某种类型的对象。不同的魔法函数具有的特性,在python中叫做协议。
编程时,尽量遵从python协议,这样写出来的代码才是足够pythonic的代码
抽象基类:在这个基础的类中,我们去设定一些方法,然后所有的继承基类的类都必须必须覆盖抽象基类里面的方法
抽象基类是无法用来实例化的
此处,由于没有在子类继承中重新定义set方法,因此抛出异常
如果重新定义了实现子类的方法,则不再抛出异常
上面模拟抽象基类的方法,不好之处在于,在调用set这个抽象基类的方法的时候才抛出异常,如何实现在初始化的时候就抛出异常? 这里就需要导入abc模块,全局下面的abc
此时,在初始化的时候就提醒,必须重载set与get的方法。
这里,只重载set方法,则会提醒抽象方法get没有实现。
采用抽象基类,在初始化时,就强制实现某些方法。
在python中实际上已经实现了一些通用的抽象基类,让我们了解python数据基类的一些接口。它放在collections.abc模块中。
判定b是不是A的类型
抽象基类:
1. 去调用isinstance
2. 做接口的强制规定
抽象基类并不是非常推荐使用的,实际上有很多其它的方法。
尽量使用鸭子类型,如果一定继承某些接口,推荐使用mixin,多继承的方式去实现。
抽象基类使用时,很容易设计过渡,不容易理解。
希望shiy