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接口与归一化设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拳皇玩家8神月是何许人(拳皇系列下载)
- 下一篇: python基本对象_python基础教