博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
9月19日学习内容整理:接口类和抽象类,原则,钻石继承,多态
阅读量:5939 次
发布时间:2019-06-19

本文共 2550 字,大约阅读时间需要 8 分钟。

一、接口类和抽象类

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

转载于:https://www.cnblogs.com/wanghl1011/articles/7551376.html

你可能感兴趣的文章
NopCommerce架构分析之八------多语言
查看>>
转:Eclipse自动补全功能轻松设置
查看>>
ES6新特性:Javascript中的Reflect对象
查看>>
hibernate逆向工程生成的实体映射需要修改
查看>>
mysql update操作
查看>>
Robots.txt - 禁止爬虫(转)
查看>>
MySQL数据库
查看>>
项目分析_xxoo-master
查看>>
SQLServer2012自增列值跳跃的问题
查看>>
ViewBag对象的更改
查看>>
Mysql 监视工具
查看>>
hdu1025 Constructing Roads In JGShining's Kingdom(二分+dp)
查看>>
Android PullToRefreshListView和ViewPager的结合使用
查看>>
禅修笔记——硅谷最受欢迎的情商课
查看>>
struts2入门(搭建环境、配置、示例)
查看>>
Caused by: org.apache.ibatis.reflection.ReflectionException我碰到的情况,原因不唯一
查看>>
linux top命令查看内存及多核CPU的使用讲述【转】
查看>>
Linux下golang开发环境搭建
查看>>
jQuery操作input
查看>>
layer弹出信息框API
查看>>