您好,登錄后才能下訂單哦!
多態(tài)指的是一類(lèi)事物有多種形態(tài)。多態(tài)的實(shí)現(xiàn)需要依賴(lài)于繼承~
import abc
class File(metaclass=abc.ABCMeta):
@abc.abstractmethod
def read(self):
pass
@abc.abstractmethod
def write(self):
pass
class Txt(File): # 文本數(shù)據(jù)的讀寫(xiě)
def read(self):
print('讀取文本數(shù)據(jù)')
def write(self):
print('寫(xiě)入文本數(shù)據(jù)')
class Process(File): # 進(jìn)程數(shù)據(jù)的讀寫(xiě)
def read(self):
print('讀取進(jìn)程數(shù)據(jù)')
def write(self):
print('寫(xiě)入進(jìn)程數(shù)據(jù)')
txt = Txt()
process = Process()
txt.read()
process.read()
上述示例中,Txt,Process都繼承自 接口類(lèi)File,且都實(shí)現(xiàn)了 read,write方法,但read,write方法的實(shí)現(xiàn)都各不相同。Txt,Process為同一類(lèi)事物,不同的形態(tài)體現(xiàn)在它們都有read,write方法,但是實(shí)現(xiàn)的方式都不一樣~
多態(tài)性是多態(tài)的一種應(yīng)用:在不考慮實(shí)例類(lèi)型的情況下使用實(shí)例。使用的場(chǎng)景往往是:調(diào)用不同對(duì)象的同名方法,不同的對(duì)象會(huì)用不同的方式來(lái)實(shí)現(xiàn)類(lèi)似的功能;
調(diào)用者無(wú)需關(guān)心對(duì)象之間的差異性,只需根據(jù)不同的場(chǎng)景調(diào)用不同對(duì)象的同名方法即可~
def read(obj):
obj.read()
def write(obj):
obj.write()
read(txt)
read(process)
write(txt)
write(process)
Txt,Process類(lèi)中的read,write方法是應(yīng)對(duì)不同的場(chǎng)景實(shí)現(xiàn)數(shù)據(jù)的讀取和寫(xiě)入,所以在使用函數(shù)read,write時(shí)候只需要根據(jù)場(chǎng)景選擇對(duì)象即可~
關(guān)于列表和元組的示例:
m_lst = [1, 2, 3]
m_tuple = ('a', 'b', 'c', 'd')
print(m_lst.__len__()) # 3
print(m_tuple.__len__()) # 4
print(m_lst.count(1)) # 1
print(m_tuple.count('c')) # 1
通過(guò)源碼可以看到 list 和 tuple 都是繼承自 object 類(lèi),相互之間沒(méi)有關(guān)系,但是它們都有很多功能類(lèi)似的同名方法。這就是Python崇尚的鴨子類(lèi)型,兩個(gè)類(lèi)之間有很多的相似之處,功能也類(lèi)似,但是這兩個(gè)類(lèi)之間沒(méi)有繼承關(guān)系,也不是繼承于同一個(gè)接口類(lèi)或者抽象類(lèi),而是兩個(gè)獨(dú)立的類(lèi),這就保證了程序組件的松耦合度~
例如上述的Txt,Process類(lèi)也可以通過(guò)這種方式來(lái)實(shí)現(xiàn):
class Txt(): # 文本數(shù)據(jù)的讀寫(xiě)
def read(self):
print('讀取文本數(shù)據(jù)')
def write(self):
print('寫(xiě)入文本數(shù)據(jù)')
class Process(): # 進(jìn)程數(shù)據(jù)的讀寫(xiě)
def read(self):
print('讀取進(jìn)程數(shù)據(jù)')
def write(self):
print('寫(xiě)入進(jìn)程數(shù)據(jù)')
.................^_^
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。