python之路 物件導向之多型

2021-08-25 08:32:19 字數 2010 閱讀 3181

什麼是多型: 一種事物具有多種形態,如水具有液態水,氣態水......

多型性:

多型性分為動態多型性與靜態多型性

靜態多型性:任何資料型別都可以使用運算子+進行運算,而運算的結果是不同的(運算子的意義取決於被操作物件)

動態多型性:繼承乙個類的多個子類中擁有相同的方法名,那麼這些子類產生的物件就可以不用考慮具體的型別,直接去呼叫類的功能,精髓是統一,例如:我們經常使用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,所以需要用到抽象類

抽象類的概念:

基於類抽象而來的(類是基於物件的抽象而來的),只能被繼承,不能被呼叫(只有抽象方法而沒有實現功能),且子類必須實現抽象方法

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 python既支援面向過程的程式設計也支援物件導向的程式設計。面向過程 程式是由過程或僅僅是可重用 的函式構建起來的。物件導向 程式是由資料和功能組合而成的物件構建起來的。物件導向中兩個重要的概念是類和物件。類是對事物的抽象,比如說 人類 物件是具...

Python學習之路 物件導向

物件導向 物件導向的程式設計的核心是物件 相當於你要處於創造者的思維來建立乙個新的東西,如你要實現什麼東西,需要幹什麼才能創造出來 要理解物件為何物。物件導向的程式設計好比作者寫 作者要解決的問題就是使主角從乙個屌絲公升級到大神的故事,作者覺得要讓主角成為大神,會給主角鋪墊從弱到強的大綱,主角很弱時...

python自學之路 物件導向

定義 指類中無需例項參與即可呼叫的方法 不需要self引數 在呼叫過程中,無需將類例項化,直接在類之後使用.號運算子呼叫方法。用法 靜態方法使用 staticmethod裝飾器來宣告 class classa object staticmethod def func a print hello py...