9月19日学习内容整理:接口类和抽象类,原则,钻石继承,多态

一、接口类和抽象类

1、接口类和抽象类只是一种编程思想,python中只有抽象类,为子类提供规范

2、归一化设计:意思是指基于同一接口的类的对象在使用时用法都一样,使用者无需关心使用的是哪一个类,只是使用它的功能而已,例如京东钱包,百度钱包,支付宝,微信支付它们都是不同的类,但都是完成支付钱的功能,所以用户在使用时无论用哪一种类,利用它们统一的接口就可以完成支付这一功能了,而如果没有这个接口,用户在使用时实际上是调用每一个类的支付方法,这样对于代码实现来说会增加很多工作

3、接口类:不实现具体的方法,多用在多继承

   抽象类:可以实现一些基础的方法,多用在单继承

class Payment(metaclass=ABCMeta):
    def payment(self,money):pass
class 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,ABCMeta
class Payment(metaclass=ABCMeta):          #接口类也就是抽象类,有了这个类,后面写代码的人就知道自己要写什么了
    @abstractmethod
    def payment(self,money):pass
class 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方法,
抽象类举例1
from abc import abstractmethod,ABCMeta
class 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()
抽象类举例2

 

二、依赖倒置原则、接口隔离原则

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天生支持多态,意思是使用实例也就是对象时不用去指定实例类型

posted @ 2017-09-19 13:28  九二零  阅读(113)  评论(0编辑  收藏  举报