一、接口类和抽象类
1、接口类和抽象类只是一种编程思想,python中只有抽象类,为子类提供规范
2、归一化设计:意思是指基于同一接口的类的对象在使用时用法都一样,使用者无需关心使用的是哪一个类,只是使用它的功能而已,例如京东钱包,百度钱包,支付宝,微信支付它们都是不同的类,但都是完成支付钱的功能,所以用户在使用时无论用哪一种类,利用它们统一的接口就可以完成支付这一功能了,而如果没有这个接口,用户在使用时实际上是调用每一个类的支付方法,这样对于代码实现来说会增加很多工作
3、接口类:不实现具体的方法,多用在多继承
抽象类:可以实现一些基础的方法,多用在单继承
class Payment(metaclass=ABCMeta): def payment(self,money):passclass Applepay(): def payment(self,money): print('apple 支付了 %d元'%money)class Alipay(): def payment(self,money): print('支付宝 支付了 %d元' % money)class Wechatpay(): def payment(self,money): print('微信 支付了 %d元' % money)def payment(pay_obj,money): #归一化设计, pay_obj.payment(money)apple = Applepay()ali = Alipay()wechat = Wechatpay()payment(wechat,100)payment(apple,100)payment(ali,100)
from abc import abstractmethod,ABCMetaclass Payment(metaclass=ABCMeta): #接口类也就是抽象类,有了这个类,后面写代码的人就知道自己要写什么了 @abstractmethod def payment(self,money):passclass Wechat(Payment): def fuqian(self,money): #这样写代码也可以实现既定的功能,但是没有实现归一化的设计,使用时必须对象自己调用 print('weixin zhifule %syuan'%money)def payment(pay_obj,money): pay_obj.payment(money)we=Wechat() #这样在实例化的时候就会报错,是因为引用了abc模块payment(w,100) #这样是会报错的,因为wechat类里没有payment方法,
from abc import abstractmethod,ABCMetaclass Foo(metaclass=ABCMeta): #抽象类,在类里也实现了一些基本的方法 @abstractmethod def read(self): f = open() f.close() @abstractmethod def write(self): f = open() f.close()class File(Foo): def read(self): super().read() def write(self): super().write()class Disk(Foo): def read(self): super().read() def write(self): super().write()
二、依赖倒置原则、接口隔离原则
1、依赖倒置原则:父类不依赖子类,都依赖抽象,一般不用父类去调用子类,总的说就是针对接口编程,而不是针对实现编程
2、接口隔离原则:使用多个专门的接口,不要用一个总接口
三、钻石继承
1、经典类,新式类
(1)python2中 经典类: class A :
新式类: class A(object): object可以理解为类祖宗
python3中 没有经典类,class A:这就是新式类
(2)经典类:深度优先
例如:A(B,C) B(D) C(D) D是最终的父类
调用时:A没有就找B,B没有就找D,D没有就找C,总的说就是一条走到底,没有再返回找
(3)新式类:广度优先
例如:A(B,C) B(D) C(D) D(object)是最终的父类
调用时:A没有就找B,B没有就找C,C没有就找D,总的说就是不会一条路走到底,而是在一定范围内找,没有再另一个范围内找,都没有就用最终的
例如2:A(B,C) B(D) D(E) C(F) E(F) E(object)是最终的父类,A没有就找B,B没有就找D,D没有就找C,C没有就找E,E没有就找F
因为B没有以后只能去找D,若直接就去找C的话,想回来已经不可能了,完全是两条路回不去,所以是先在一定范围找,没有就找另一个范围名,但是不能一条路走到底
(3)经典类和新式类的区别
a)有没有obobject,有就是新式类在啊python2中,python3中只有新式类
b)经典类是深度优先,新式类是广度优先
c)子类名. mro() 可以看查找顺序,但是只适用于新式类
四、多态
1、多态是指一类事物有多种形态,例如动物有人,猫,狗
2、python天生支持多态,意思是使用实例也就是对象时不用去指定实例类型