python数据接口设计_Python接口与归一化设计
1.什么是接口(interface)
接口(interface)是面向对象编程语言中接口操作的关键字,功能是把所需成员组合起来,用来装封一定功能的集合。它好比一个模板,在其中定义了对象必须实现的成员,通过类或结构来实现它。接口不能直接实例化,接口不能包含成员的任何代码,只定义成员本身。接口成员的具体代码由实现接口的类提供。
2.归一化
使用接口的意义在于归一化,什么叫归一化:就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。归一化的好处在于:
归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。
归一化使得上层的外部使用者可以不加区分的处理所有接口兼容的对象集合
1. 就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。
2. 再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样
3.Python中的interface
首先先看一个Java代码的接口实例:
1 //Java 语言中的接口很好的展现了接口的含义: IAnimal.java
2
3 /*
4
5 * Java的Interface很好的体现了我们前面分析的接口的特征:6
7 * 1)是一组功能的集合,而不是一个功能8
9 * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作10
11 * 3)接口只定义函数,但不涉及函数实现12
13 * 4)这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal里面了14
15 */
16 /*Animal接口*/
17 packagecom.oo.demo;18
19 public interfaceIAnimal {20 public voideat();21 public voidrun();22 public voidsleep();23 public voidspeak();24 }25 //========== Pig.java
26 packagecom.oo.demo;27
28 public class Pig implements IAnimal{ //如下每个函数都需要详细实现
29 public voideat(){30 System.out.println("Pig like to eat grass");31 }32
33
34 public voidrun(){35 System.out.println("Pig run: front legs, back legs");36 }37
38
39 public voidsleep(){40 System.out.println("Pig sleep 16 hours every day");41 }42
43
44 public voidspeak(){45 System.out.println("Pig can not speak");46 }47 }48
49 //=============== Person.java
50 packagecom.oo.demo;51
52 public class Person2 implementsIAnimal {53 public voideat(){54 System.out.println("Person like to eat meat");55 }56
57 public voidrun(){58
59 System.out.println("Person run: left leg, right leg");60
61 }62
63 public voidsleep(){64 System.out.println("Person sleep 8 hours every dat");65 }66
67
68 public voidspeak(){69 System.out.println("Hellow world, I am a person");70 }71 }
View Code
在python中根本就没有一个叫做interface的关键字,可以使用抽象类似的效果:
3.1 抽象类
与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。比如:我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子。你永远无法吃到一个叫做水果的东西。
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的。
3.2 抽象类与接口
抽象类的本质还是类,指的是一组类的属性,包括数据属性(如all_type)和方法属性(如read、write),而接口只强调函数属性的相似性。抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计。
3.3 在Python中实现抽象类
3.3.1 ABC模块
Python有一个模块:ABC,Abstract Base Class(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现。相当于是Java中的接口或者是抽象类。首先看一个ABC的使用案例:
1 import abc #利用abc模块实现抽象类
2
3
4 class AllFile(metaclass=abc.ABCMeta):5 all_type = 'file'
6
7 @abc.abstractmethod #定义抽象方法,无需实现功能
8 defread(self):9 """子类必须定义读功能"""
10 pass
11
12 @abc.abstractmethod #定义抽象方法,无需实现功能
13 defwrite(self):14 """子类必须定义写功能"""
15 pass
16
17
18 classTxt(AllFile):19 pass
20
21
22 t1 = Txt() #报错,子类没有定义抽象方法
运行结果如下:
Traceback (most recent call last):
File"E:/workspace/py3demo/02.py", line 23, in t1= Txt() #报错,子类没有定义抽象方法
TypeError: Can't instantiate abstract class Txt with abstract methods read, write
发现运行出现错误“Can't instantiate abstract class Txt with abstract methods read, write”,意思大致是“不能对抽象类Txt的抽象方法read、write进行实例化”!
重新来设计:
1 import abc #利用abc模块实现抽象类
2
3
4 class AllFile(metaclass=abc.ABCMeta):5 all_type = 'file'
6
7 @abc.abstractmethod #定义抽象方法,无需实现功能
8 defread(self):9 """子类必须定义读功能"""
10 pass
11
12 @abc.abstractmethod #定义抽象方法,无需实现功能
13 defwrite(self):14 """子类必须定义写功能"""
15 pass
16
17
18 class Txt(AllFile): #子类继承抽象类,但是必须定义read和write方法
19 defread(self):20 print('文本数据的读取方法')21
22 defwrite(self):23 print('文本数据的读取方法')24
25
26 class Sata(AllFile): #子类继承抽象类,但是必须定义read和write方法
27 defread(self):28 print('硬盘数据的读取方法')29
30 defwrite(self):31 print('硬盘数据的读取方法')32
33
34 class Process(AllFile): #子类继承抽象类,但是必须定义read和write方法
35 defread(self):36 print('进程数据的读取方法')37
38 defwrite(self):39 print('进程数据的读取方法')40
41
42 wenbenwenjian =Txt()43
44 yingpanwenjian =Sata()45
46 jinchengwenjian =Process()47
48 #这样大家都是被归一化了,也就是一切皆文件的思想
49 wenbenwenjian.read()50 yingpanwenjian.write()51 jinchengwenjian.read()52
53 print(wenbenwenjian.all_type)54 print(yingpanwenjian.all_type)55 print(jinchengwenjian.all_type)
运行结果如下:
文本数据的读取方法
硬盘数据的读取方法
进程数据的读取方法
file
file
file
3.4.2 抛出异常
可以在抽象类的抽象方法中抛出异常,若派生类中重新实现了该抽象方法,则将会覆盖掉派生类中的派生方法,否则将会抛出异常:
1 classAllFile(object):2 all_type = 'file'
3
4 defread(self):5 """子类必须定义读功能"""
6 raise NotImplementedError('未实现该方法!')7
8 defwrite(self):9 """子类必须定义写功能"""
10 raise NotImplementedError('未实现该方法!')11
12
13 classTxt(AllFile):14 pass
15
16
17 t1 = Txt() #报错,子类没有定义抽象方法
18 t1.write()
运行程序,结果如下:
raise NotImplementedError('未实现该方法!')
NotImplementedError: 未实现该方法!
可以看出,继承于抽象类AllFile的txt在未实现write方法时,抛出了NotImplementedError异常,同样达到了限制的功能。
本文参考:
lynnyq:https://blog.csdn.net/lynnyq/article/details/79560867
python数据接口设计_Python接口与归一化设计相关推荐
- python中接口测试垃圾数据如何清理_Python接口测试题(持续更新中)
1.json和字典的区别? Json是轻量级的数据交互格式,以key-value的键值对形式来保存数据,结构清晰,可以说是目前互联网项目开发中最常用的一种数据交互格式. 字典,同样是以key-valu ...
- python自动化测试教程百度云盘_Python接口自动化测试框架实战视频教程百度云下载...
主流的Fiddler.Requests.Unittest.Mock等接口测试工具/框架应用 进阶自动化框架设计开发 课程目录: 1-1 接口自动化测试从基础到框架-导学 1-2 接口基础知识回顾 1- ...
- python 接口自动化_Python 接口自动化测试
1. 接口基础知识 1.1 接口分类 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口. (1) webservice接口:走soap协议通过http传输,请求报文和返回报文都是xml格 ...
- python自动化测试判断方法_python接口自动化测试之根据excel中的期望结果是否存在于请求返回的响应值中来判断用例是否执行成功...
1.首先在excel中填写好预期结果的值 这里判断接口成功的依据是预期结果值是否存在于接口的返回数据中. 一般接口的返回值都是json对象,我们需要将json对象转换为json格式的字符串 如下图,进 ...
- python 数据框缺失值_Python:处理数据框中的缺失值
python 数据框缺失值 介绍 (Introduction) In the last article we went through on how to find the missing value ...
- python数据统计代码_Python 数据的累加与统计的示例代码
问题 你需要处理一个很大的数据集并需要计算数据总和或其他统计量. 解决方案 对于任何涉及到统计.时间序列以及其他相关技术的数据分析问题,都可以考虑使用 Pandas库 . 为了让你先体验下,下面是一个 ...
- python数据建模数据集_Python中的数据集
python数据建模数据集 There are useful Python packages that allow loading publicly available datasets with j ...
- 成都python数据分析师培训_python数据分析师
企业想要在竞争激烈的市场中胜出,决策的速度和反应的效率尤为重要.根据调查显示,75%的企业在面临拟定策略时,常常无法获得实时且有根据的决策信息.什么样的数据.要透过什么样的方法,才能且实时的转变成决策 ...
- python数据科学库_Python数据科学库
python数据科学库 什么是数据科学? (What is Data Science?) We live in an information age, where the challenge is t ...
最新文章
- 使用python写Wave文件
- 能够附加图片的标签控件iOS项目源码
- iOS 自动构建套件 - flow.ci + fir.im + Coding
- k8s集群部署之环境介绍与etcd数据库集群部署
- eclipse远程调试失败
- 启动hadoop没有resourcemanager_5.hadoop-MR YARN架构理论与集群搭建
- centos6,7grub防止其他用户通过单用户系统破解root密码
- Spring源码解析:自定义标签的解析过程
- html 登陆sql server,jsp实现注册与登录页面+sqlsever2008
- 开发人员避免编写测试的2个最常见原因
- 智能机器人建房子后房价走势_深圳建二手房价引导制度,学习长沙意图明显,距离稳准狠差点意思...
- Java DataOutputStream writeByte()方法与示例
- SpringBoot2 整合OAuth2组件,模拟第三方授权访问
- 计算机应用技术专业标志,计算机应用技术论文
- DLL中资源切换的两种方法
- oracle registers,【案例】Oracle RAC强制删除node节点过程的详细笔记
- 华为鸿蒙mate,华为MatePad Pro发布亮相!华为首款鸿蒙平板全新体验!
- 这几种方法帮你快速实现回到页面顶部
- matlab中欧姆如何表示,Excel中怎样输入欧姆特殊符号
- 网易面试题,小易沉迷游戏
热门文章
- create-react-app应用的入口定义
- GUID generation RSS_SYSTEM_GET_UNIQUE_ID
- 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?
- 使用noConclict后仍然能够在函数体内继续使用$的方法
- how is Customizing activity launched by ABAP Framework
- Send data format set as XML
- SAP ABAP RFC table administration
- ABAP很厉害是怎么一种体验?
- 微信程序开发系列教程(一)开发环境搭建
- android4.0 菜单,三大主流安卓4.0界面解析 MIUI最实用