什麼是多型: 一種事物具有多種形態,如水具有液態水,氣態水......
多型性:多型性分為動態多型性與靜態多型性
靜態多型性:任何資料型別都可以使用運算子+進行運算,而運算的結果是不同的(運算子的意義取決於被操作物件)
動態多型性:繼承乙個類的多個子類中擁有相同的方法名,那麼這些子類產生的物件就可以不用考慮具體的型別,直接去呼叫類的功能,精髓是統一,例如:我們經常使用len()這個內建函式(實際上是呼叫了__len__方法)去得到乙個資料型別的長度(我們並不會去考慮被操作的物件到底是什麼資料型別,只需要知道它是可迭代的),而不是每個資料型別各使用一種與其對應的方法
例如,我們將人的說話技能和貓叫都定義為speak()函式,那麼使用者在使用的過程中根本不需要去考慮人應該呼叫什麼,貓應該呼叫什麼,只需要知道有乙個speak()方法,甚至我們可以定義乙個介面函式func,不管什麼型別的物件進來,只需要他有乙個speak方法就可以,這大大降低了使用者的操作難度
class people():
def speak(self):
print('say hello')
class cat():
def speak(self):
print('喵喵')
def func(obj):
obj.speak()
obj1 = people()
obj2 = cat()
func(obj1)
func(obj2)
如何強制的達到統一的效果?通過介面
介面提取了一群類的共同函式,可以將介面理解為這些函式的集合,然後我們讓子類去實現這些介面內的函式,這樣的好處在於
實現了歸一化(所有基於乙個介面實現的類,這些類例項化的物件在使用時,他們的用法是一致的),
而歸一化的好處在於:
1.物件的使用者不必考慮物件的類具體是什麼,只要關心物件擁有什麼樣的功能,極大的降低了使用者的使用難度
2.對於高層的外部使用者可以不區分的處理所有介面相容的物件集合(例如linux的一切皆檔案,所有的東西都可以當作檔案去操作,而不必去考慮是硬碟還是記憶體)
python中並沒有定製介面的關鍵字inte***ce,所以需要用到抽象類
抽象類的概念:
基於類抽象而來的(類是基於物件的抽象而來的),只能被繼承,不能被呼叫(只有抽象方法而沒有實現功能),且子類必須實現抽象方法
但是python並不支援這麼做(大家都是成年人了),python推崇的是鴨子型別,只要你叫的像鴨子並且走路也像鴨子,那麼你就是鴨子,python推崇的是約定俗成import abc
class allfile(metaclass=abc.abcmeta):
def read(self):
pass #規定子類必須要有read功能
def write(self):
pass #規定子類必須要有write功能
class txt(allfile):
def read(self):
print('正在讀取文字...')
def write(self):
print('正在編輯文字...')
class process(allfile):
def read(self):
print('正在載入程序...')
def write(self):
print('正在修改程序...')
txt = txt()
pro = process()
txt.read()
pro.read() #實現了歸一化
# 抽象類是介於類與介面之間的,強調資料屬性與函式屬性的相似
python之路 物件導向
不了解什麼是物件導向,就無法更好的掌握python python既支援面向過程的程式設計也支援物件導向的程式設計。面向過程 程式是由過程或僅僅是可重用 的函式構建起來的。物件導向 程式是由資料和功能組合而成的物件構建起來的。物件導向中兩個重要的概念是類和物件。類是對事物的抽象,比如說 人類 物件是具...
Python學習之路 物件導向
物件導向 物件導向的程式設計的核心是物件 相當於你要處於創造者的思維來建立乙個新的東西,如你要實現什麼東西,需要幹什麼才能創造出來 要理解物件為何物。物件導向的程式設計好比作者寫 作者要解決的問題就是使主角從乙個屌絲公升級到大神的故事,作者覺得要讓主角成為大神,會給主角鋪墊從弱到強的大綱,主角很弱時...
python自學之路 物件導向
定義 指類中無需例項參與即可呼叫的方法 不需要self引數 在呼叫過程中,無需將類例項化,直接在類之後使用.號運算子呼叫方法。用法 靜態方法使用 staticmethod裝飾器來宣告 class classa object staticmethod def func a print hello py...