+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-08(82)

2019-09(116)

2019-10(2)

Python学习日记(二十五) 接口类、抽象类、多态

发布于2019-09-09 10:19     阅读(751)     评论(0)     点赞(24)     收藏(3)


接口类

继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口的功能

比如说一种支付方式有三种不同的途径:Alipay、Applepay、Wechatpay

如果现在只有两种支付方式Alipay和Wechatpay,我们该如何去实现支付的方法呢?

复制代码
class Wechat:
    def pay(self,money):
        print('已经用了微信支付了%s元'%money)
class Alipay:
    def pay(self,money):
        print('已经用了支付宝支付了%s元'%money)
wechat = Wechat()
wechat.pay(200)             #已经用了微信支付了200元
ali = Alipay()
ali.pay(150)                #已经用了支付宝支付了150元
复制代码

但是这样做有一点不好就是用户要去关心他在支付的时候是用什么方式去pay的,而我们只需要传一个支付的对象和钱就好了

复制代码
def pay(obj_pay,money):     #定义一个支付函数
    obj_pay.pay(money)
class Wechat:
    def pay(self,money):
        print('已经用了微信支付了%s元'%money)
class Alipay:
    def pay(self,money):
        print('已经用了支付宝支付了%s元'%money)
wechat = Wechat()
pay(wechat,300)             #已经用了微信支付了300元
ali = Alipay()
pay(ali,250)                #已经用了支付宝支付了250元
复制代码

这样写虽然可以,但是假设在之后添加了一个新的类Applepay的付款方式,里面的方法名和pay名不同就会导致报错

复制代码
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self,money):
        raise NotImplemented

class Wechat(Payment):
    def pay(self,money):
        print('已经用了微信支付了%s元'%money)
class Alipay(Payment):
    def pay(self,money):
        print('已经用了支付宝支付了%s元'%money)
class Apple(Payment):
    def payMoney(self,money):
        print('已经用了支付宝支付了%s元'%money)

wechat = Wechat()
ali = Alipay()
apple = Apple()         #Can't instantiate abstract class Apple with abstract methods pay
复制代码

这样的话如果开发人员写的方法名和pay不同时,程序在实例化对象就会报错就直接给给开发人员提示了要用规范的方法去写。如果我们再把Apple类中的方法给改回pay的方法名,那么就不会报错了

class Apple(Payment):
    def pay(self,money):
        print('已经用了支付宝支付了%s元'%money)

apple = Apple()

接口的多继承

如果我们归纳下面三种动物的行为,老虎能走路、游泳;天鹅能飞、走路、游泳;老鹰能走路、飞,我们该如何用接口的方法去表示呢?

复制代码
from abc import abstractmethod,ABCMeta
class Swim_Behavior(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
class Walk_Behavior(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
class Fly_Behavior(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass

class Tiger(Swim_Behavior,Walk_Behavior):
    def walk(self):
        print('Can walk!')
    def swim(self):
        print('Can swim!')

class Swan(Swim_Behavior,Walk_Behavior,Fly_Behavior):
    def walk(self):
        print('Can walk!')
    def swim(self):
        print('Can swim!')
    def fly(self):
        print('Can fly!')

class Hawk(Walk_Behavior,Fly_Behavior):
    def walk(self):
        print('Can walk!')
    def fly(self):
        print('Can fly!')

t = Tiger()
s = Swan()
h = Hawk()
复制代码

接口类本身的方法不实现只是起到规范的作用

接口隔离原则:

使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口

专门的接口指的是上面的动物能walk就用walk的接口,能fly就用fly的接口,能swim就用swim的接口

不使用单一的接口指的是不应该使用一个接口里面既能有walk的行为又有fly的行为等,只有这样把每一个功能都隔离开,我们在后面用到这个功能就能够继承到它所有相关变量名和方法名

即客户端不应该依赖那些不需要的接口指的是创建了一个Tiger类不应该要那些自己本身没有的类,比如fly

 

抽象类

抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性

复制代码
#在操作系统中一切皆文件
from abc import abstractmethod,ABCMeta
class All_file(metaclass=ABCMeta):
    all_type = 'file'               #所有的类型都是文件
    @abstractmethod                 #定义一个抽象方法无需实现功能
    def write(self):
        pass
    @abstractmethod                 #定义一个抽象方法无需实现功能
    def read(self):
        pass

class Txt(All_file):                #定义一个Txt类,子类继承抽象类,但是必须定义一个write和read的方法
    def write(self):
        print('Write something...')
    def read(self):
        print('Read something...')

class Sata(All_file):               #定义一个Sata类,子类继承抽象类,但是必须定义一个write和read的方法
    def write(self):
        print('Write something...')
    def read(self):
        print('Read something...')

txt = Txt()
sata = Sata()

txt.read()                      #Read something...
txt.write()                     #Write something...
sata.read()                     #Read something...
sata.write()                    #Write something...
print(txt.all_type)             #file
print(sata.all_type)            #file
复制代码

抽象类是一种规范,一般情况下单继承能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现;多继承情况由于功能比较复杂,所以不容易抽象出相同的功能,具体实现写在父类中

 

接口类和抽象类总结

在python中没有接口类,但有抽象类;abc模块中的metaclass = ABCMeta,@abstractmethod它的本质是做代码的规范用的,希望子类中能实现父类名字完全一样的方法

接口类和抽象类:

从java的角度上看是有区别的,java本来就支持单继承所以就有了抽象类;java没有多继承,所以为了接口隔离原则,设计了接口这个概念,支持多继承了

而python它既支持单继承也支持多继承,所以对于接口类和抽象类的区别就不会那么明显了,甚至在python中没有内置接口类

 

多态

多态指的是一类事物有多种形态

python天生支持多态

复制代码
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):               #支付方式类
    @abstractmethod
    def pay(self,money):
        pass

class Wechat(Payment):                          #支付方式---微信支付
    def pay(self,money):
        print('已经用了微信支付了%s元'%money)
class Alipay(Payment):                          #支付方式---支付宝支付
    def pay(self,money):
        print('已经用了支付宝支付了%s元'%money)
class Apple(Payment):                           #支付方式---苹果支付
    def pay(self,money):
        print('已经用了支付宝支付了%s元'%money)
复制代码

多态性

就是虽然是一类东西但是它们执行的是相同的方法但是做的是不同的事,比如微信它用的是微信支付、支付宝它用的是支付宝支付、苹果支付它用的是苹果支付...

鸭子类型

python语言里面有一个鸭子类型的概念,而在某些其他的属于强类型语言,用的是多态

鸭子类型:不崇尚根据继承所得来的相似,我只是自己实现我自己的代码就可以了,如果有两个类它们刚好相似,并不产生父类的子类的兄弟关系,那这就是鸭子类型。像list、tuple这种相似,是自己写代码的时候约束的,而不是通过父类约束的



所属网站分类: 技术文章 > python文章

作者:23dh

链接: http://www.pythonheidong.com/blog/article/103725/

来源:python黑洞网 www.pythonheidong.com

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

24 0

赞一赞 or 踩一踩

收藏该文
已收藏

评论内容:(最多支持255个字符)

相似文章

  Python学习手册(第4版) pdf下载

  python科学计算第二版(英文) pdf下载

  Python3程序开发指南(第二版) pdf下载

  父与子的编程之旅:与小卡特一起学Python(中文PDF+源码打包) 下载

  Beginning Python Games Development(2nd) pdf下载

  Python学习手册 : (第3版) pdf下载

  Python编程实战 运用设计模式、并发和程序库创建高质量程序 pdf下载

  像计算机科学家一样思考Python pdf下载

  python面试题之介绍一下Python下range()函数的用法?

  图灵学院 Python全系列教程全栈工程师 python视频教程下载

优质资源排行榜

 python经典电子书大合集下载 下载次数 8108

 零基础java开发工程师视频教程全套,基础+进阶+项目实战(152G) 下载次数 7545

 零基础前端开发工程师视频教程全套,基础+进阶+项目实战(共120G) 下载次数 7439

 零基础大数据全套视频400G 下载次数 7002

 零基础php开发工程师视频教程全套,基础+进阶+项目实战(80G) 下载次数 6891

 零基础软件测试全套系统教程 下载次数 6502

 全套人工智能视频+pdf 下载次数 6437

 IOS全套视频教程 基础班+就业班 下载次数 4679

 编程小白的第一本python入门书(高清版)PDF下载 下载次数 3106

10  effective python编写高质量Python代码的59个有效方法 pdf下载 下载次数 3073

11  Python深度学习 pdf下载 下载次数 3044

12  使用python+pygame开发的小游戏《嗷大喵快跑》源码下载 下载次数 2998

13  python项目开发视频 下载次数 2998

14  python从入门到精通视频(全60集)python视频教程下载 下载次数 2994

15  黑马2017年java就业班全套视频教程 下载次数 2992

16  python实战项目 平铺图像板系统源码下载,适用于想要保存,标记和共享图像,视频和网页的用户 下载次数 2987

17  利用python实现程序内存监控脚本 下载次数 2986

18  树莓派Python编程指南 pdf下载 下载次数 2980

19  老男孩python自动化视频 下载次数 2979

20  老王python基础+进阶+项目视频教程 下载次数 2972

21  尚硅谷Go学科全套视频 下载次数 2972

22  某硅谷Python项目+AI课程+核心基础视频教程 下载次数 2967

23  Web前端实战精品课程 下载次数 2966

24  Python基础教程 pdf下载 下载次数 2966

25  tron python小游戏 下载次数 2962

26  [小甲鱼]零基础入门学习Python 下载次数 2959

27  老男孩python全栈开发15期 下载次数 2958

28  2017最新web前端开发完整视频教程附源码 下载次数 2948

29  最新全套完整JAVAWEB2018开发视频 下载次数 2926

30  Python算法教程_中文版 pdf下载 下载次数 2913

31  Spring boot实战视频6套下载 下载次数 2909

32  python全套视频十五期(116G) 下载次数 2901

33  Python项目实战 下载次数 2883

34  python全自动抢火车票教程-python视频教程下载 下载次数 2883

35  30个小时搞定Python网络爬虫 含源码 下载次数 2881

36  尚硅谷大数据之Hadoop视频 下载次数 2876

37  简明python教程 (A Byte of Python)pdf下载 下载次数 2873

38  Python Cookbook第三版中文PDF下载高清完整扫描原版 下载次数 2865

39  Python A~B~C~ python视频教程下载 下载次数 2864

40  数据结构与算法视频(小甲鱼讲解-全) 下载次数 2863

41  web小程序表白天数倒计时源码下载 下载次数 2862

42  python基础视频教程 下载次数 2862

43  Python高性能编程 pdf下载 下载次数 2862

44  go语言全套视频 下载次数 2854

45  利用Python进行数据分析 pdf下载 下载次数 2850

46  清华学霸尹成Python爬虫视频-ok 下载次数 2845

47  黑马前端36期最全视频和代码 下载次数 2841

48  2018最新全套web前端视频教程+源码下载 下载次数 2840

49  老男孩Python自动化开发12期 老男孩最强一期python高级运维开发课程 第二部分 70GB 下载次数 2832

50  笨办法学python pdf下载 下载次数 2828