python 抽象类的意义_python之抽象类
1什么是抽象類
與java一樣,python也有抽象類的概念但是同樣需要借助模塊實(shí)現(xiàn),抽象類是一個(gè)特殊的類,它的特殊之處在于只能被繼承,不能被實(shí)例化
2為什么要有抽象類
如果說(shuō)類是從一堆對(duì)象中抽取相同的內(nèi)容而來(lái)的,那么抽象類就是從一堆類中抽取相同的內(nèi)容而來(lái)的,內(nèi)容包括數(shù)據(jù)屬性和函數(shù)屬性。
比如我們有香蕉的類,有蘋果的類,有桃子的類,從這些類抽取相同的內(nèi)容就是水果這個(gè)抽象的類,你吃水果時(shí),要么是吃一個(gè)具體的香蕉,要么是吃一個(gè)具體的桃子。。。。。。你永遠(yuǎn)無(wú)法吃到一個(gè)叫做水果的東西。
從設(shè)計(jì)角度去看,如果類是從現(xiàn)實(shí)對(duì)象抽象而來(lái)的,那么抽象類就是基于類抽象而來(lái)的。
從實(shí)現(xiàn)角度來(lái)看,抽象類與普通類的不同之處在于:抽象類中只能有抽象方法(沒(méi)有實(shí)現(xiàn)功能),該類不能被實(shí)例化,只能被繼承,且子類必須實(shí)現(xiàn)抽象方法。
3在python中實(shí)現(xiàn)抽象
import abc #利用abc模塊實(shí)現(xiàn)抽象類
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定義抽象方法,無(wú)需實(shí)現(xiàn)功能
def read(self):
'子類必須定義讀功能'
pass
@abc.abstractmethod #定義抽象方法,無(wú)需實(shí)現(xiàn)功能
def write(self):
'子類必須定義寫(xiě)功能'
pass
# class Txt(All_file):
# pass
#
# t1=Txt() #報(bào)錯(cuò),子類沒(méi)有定義抽象方法
class Txt(All_file): #子類繼承抽象類,但是必須定義read和write方法
def read(self):
print('文本數(shù)據(jù)的讀取方法')
def write(self):
print('文本數(shù)據(jù)的讀取方法')
class Sata(All_file): #子類繼承抽象類,但是必須定義read和write方法
def read(self):
print('硬盤數(shù)據(jù)的讀取方法')
def write(self):
print('硬盤數(shù)據(jù)的讀取方法')
class Process(All_file): #子類繼承抽象類,但是必須定義read和write方法
def read(self):
print('進(jìn)程數(shù)據(jù)的讀取方法')
def write(self):
print('進(jìn)程數(shù)據(jù)的讀取方法')
wenbenwenjian=Txt()
yingpanwenjian=Sata()
jinchengwenjian=Process()
#這樣大家都是被歸一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()
print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
4抽象類與接口
抽象類的本質(zhì)還是類,指的是一組類的相似性,包括數(shù)據(jù)屬性(如all_type)和函數(shù)屬性(如read、write),而接口只強(qiáng)調(diào)函數(shù)屬性的相似性。
抽象類是一個(gè)介于類和接口直接的一個(gè)概念,同時(shí)具備類和接口的部分特性,可以用來(lái)實(shí)現(xiàn)歸一化設(shè)計(jì)
5繼承原理
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有這個(gè)屬性可以查看線性列表,經(jīng)典類沒(méi)有這個(gè)屬性
#新式類繼承順序:F->D->B->E->C->A
#經(jīng)典類繼承順序:F->D->B->A->E->C
#python3中統(tǒng)一都是新式類
#pyhon2中才分新式類與經(jīng)典類
對(duì)于你定義的每一個(gè)類,python會(huì)計(jì)算出一個(gè)方法解析順序(MRO)列表,這個(gè)MRO列表就是一個(gè)簡(jiǎn)單的所有基類的線性順序列表
>>> F.mro() #等同于F.__mro__
[, , , , , , ]
為了實(shí)現(xiàn)繼承,python會(huì)在MRO列表上從左到右開(kāi)始查找基類,直到找到第一個(gè)匹配這個(gè)屬性的類為止。
而這個(gè)MRO列表的構(gòu)造是通過(guò)一個(gè)C3線性化算法來(lái)實(shí)現(xiàn)的。我們不去深究這個(gè)算法的數(shù)學(xué)原理,它實(shí)際上就是合并所有父類的MRO列表并遵循如下三條準(zhǔn)則:
1.子類會(huì)先于父類被檢查
2.多個(gè)父類會(huì)根據(jù)它們?cè)诹斜碇械捻樞虮粰z查
3.如果對(duì)下一個(gè)類存在兩個(gè)合法的選擇,選擇第一個(gè)父類
總結(jié)
以上是生活随笔為你收集整理的python 抽象类的意义_python之抽象类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 开发复杂业务系统,有哪些设计思路
- 下一篇: 【双足机器人(3)】3D线性倒立摆Pyt