热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Python接口类抽象类

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python-接口类-抽象类相关的知识,希望对你有一定的参考价值。接口类

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python- 接口类-抽象类相关的知识,希望对你有一定的参考价值。


接口类

继承有两种用途:

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)  

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能


技术分享图片技术分享图片

1 # 一:这样不好,我要统一一下支付的规则.
2
3 class QQpay:
4 def pay(self,money):
5 print(使用qq支付%s元 % money)
6
7 class Alipay:
8 def pay(self,money):
9 print(使用阿里支付%s元 % money)
10
11 a = Alipay()
12 a.pay(100)
13
14 b = QQpay()
15 b.pay(200)
16
17 # 二,统一支付的规则 归一化设计,统一 pay接口
18 class QQpay:
19 def pay(self,money):
20 print(使用qq支付%s元 % money)
21
22 class Alipay:
23 def pay(self,money):
24 print(使用阿里支付%s元 % money)
25
26 def pay(obj,money):
27 obj.pay(money)
28
29 a = Alipay()
30 b = QQpay()
31
32 pay(a,100)
33 pay(b,200)
34
35 # 三,但是,来了一个野生程序员,他不知道你的约定俗成的规则,就会出问题
36
37 class QQpay:
38 def pay(self,money):
39 print(使用qq支付%s元 % money)
40
41 class Alipay:
42 def pay(self,money):
43 print(使用阿里支付%s元 % money)
44
45 class Wechatpay:
46 def fuqian(self,money):
47 print(使用微信支付%s元 % money)
48
49 def pay(obj,money):
50 obj.pay(money)
51
52 a = Alipay()
53 b = QQpay()
54
55 pay(a,100)
56 pay(b,200)
57
58 c = Wechatpay()
59 c.fuqian(300)
60
61 # 四,解决方式
62 # 定义一个父类,什么都不写,只是要求继承我的所有类有一个pay方法,这样就制定了一个规范,这就叫做接口类,后者抽象类.
63 class Payment:
64 def pay(self):pass
65
66 class QQpay(Payment):
67 def pay(self,money):
68 print(使用qq支付%s元 % money)
69
70 class Alipay(Payment):
71 def pay(self,money):
72 print(使用阿里支付%s元 % money)
73
74 class Wechatpay(Payment):
75 def fuqian(self,money):
76 print(使用微信支付%s元 % money)
77
78
79 def pay(obj,money):
80 obj.pay(money)
81
82 a = Alipay()
83 b = QQpay()
84
85 pay(a,100)
86 pay(b,200)
87
88 c = Wechatpay()
89 c.fuqian(300)
90
91 #五,他还是不知道看你这些都继承了一个类,所以你要制定一个规范,强制他执行.
92 # 创建一个规范
93 from abc import ABCMeta,abstractmethod
94 class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类
95 @abstractmethod
96 def pay(self):pass # 抽象方法
97
98 class Alipay(Payment):
99 def pay(self,money):
100 print(使用支付宝支付了%s元%money)
101
102 class QQpay(Payment):
103 def pay(self,money):
104 print(使用qq支付了%s元%money)
105
106 class Wechatpay(Payment):
107 # def pay(self,money):
108 # print(‘使用微信支付了%s元‘%money)
109 def recharge(self):pass
110
111 def pay(a,money):
112 a.pay(money)
113
114 a = Alipay()
115 a.pay(100)
116 pay(a,100) # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
117 q = QQpay()
118 q.pay(100)
119 pay(q,100)
120 w = Wechatpay()
121 pay(w,100) # 到用的时候才会报错
122
123
124
125 # 抽象类和接口类做的事情 :建立规范
126 # 制定一个类的metaclass是ABCMeta,
127 # 那么这个类就变成了一个抽象类(接口类)
128 # 这个类的主要功能就是建立一个规范
129
130 接口类示例


View Code

实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。

 


依赖倒置原则:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程

  

在python中根本就没有一个叫做interface的关键字,上面的代码只是看起来像接口,其实并没有起到接口的作用,子类完全可以不用去实现接口 ,如果非要去模仿接口的概念,可以借助第三方模块:

http://pypi.python.org/pypi/zope.interface

twisted的twistedinternetinterface.py里使用zope.interface

文档https://zopeinterface.readthedocs.io/en/latest/

设计模式:https://github.com/faif/python-patterns


技术分享图片技术分享图片

1 接口提取了一群类共同的函数,可以把接口当做一个函数的集合。
2
3 然后让子类去实现接口中的函数。
4
5 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。
6
7 归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。
8
9 比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。
10
11 再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样


为什么使用接口

 



推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linu ... [详细]
author-avatar
孟hinrichs
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有