新聞中心
python為什么沒有多態(tài)?使用什么類型來替代多態(tài)?
python不支持多態(tài),也不用支持多態(tài),python是一種多態(tài)語言,崇尚鴨子類型。在程序設(shè)計(jì)中,鴨子類型(英語:ducktyping)是動態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。這個概念的名字來源于由JamesWhitcombRiley提出的鴨子測試,鴨子測試可以這樣表述:當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。在鴨子類型中,關(guān)注的不是對象的類型本身,而是它是如何使用的。例如,在不使用鴨子類型的語言中,我們可以編寫一個函數(shù),它接受一個類型為鴨的對象,并調(diào)用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個函數(shù)可以接受一個任意類型的對象,并調(diào)用它的走和叫方法。如果這些需要被調(diào)用的方法不存在,那么將引發(fā)一個運(yùn)行時錯誤。任何擁有這樣的正確的走和叫方法的對象都可被函數(shù)接受的這種行為引出了以上表述,這種決定類型的方式因此得名。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括噶爾網(wǎng)站建設(shè)、噶爾網(wǎng)站制作、噶爾網(wǎng)頁制作以及噶爾網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,噶爾網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到噶爾省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Python中的面向?qū)ο螅ǜ呒墸┲接蟹椒?、多繼承、多態(tài)
特征:私有屬性與私有方法不能從外部被調(diào)用,也不能被子類繼承
唯一寫法:在屬性或方法前面加上__(兩個下劃線)
我們寫一個簡單的例子,創(chuàng)建一個類,包含私有方法、私有屬性、普通方法、普通屬性,并生成一個實(shí)例
私有屬性和私有方法可以從內(nèi)部被調(diào)用(總不能我寫了,但是哪都不讓用吧)
我們試試在類里再加入一個新的方法,調(diào)用私有方法和屬性
可以看到,私有屬性和私有方法是可以在類內(nèi)部被調(diào)用的。
舉個私有屬性應(yīng)用場景的例子
二。object類
我們試一下
三。多繼承
一個子類可以繼承多個父類,用逗號隔開
多個父類中有同名方法時,按照繼承順序進(jìn)行調(diào)用
四。多態(tài)
當(dāng)不同的實(shí)例,有同名的方法時,我們可以一個函數(shù),傳入不同的實(shí)例,執(zhí)行對應(yīng)的方法。
我們定義一個貓和一個狗的類,兩個類中都有'叫'的方法。并各生成一個實(shí)例。
定義一個函數(shù),用函數(shù)來調(diào)用'叫'的方法
這就叫多態(tài)。
Python類的繼承與多態(tài)詳細(xì)介紹
類(Class): 用來描述具有相同的屬性和方法的對象的集合。
類變量:類變量在整個實(shí)例化的對象中是公用的。類變量定義在類中且在函數(shù)體之外。類變量通常不作為實(shí)例變量使用。
類有一個名為 __init__() 的特殊方法(構(gòu)造方法),該方法在類實(shí)例化時會自動調(diào)用
self:self 代表的是類的實(shí)例,代表當(dāng)前對象的地址,而 self.class 則指向類。
類調(diào)用 Car.weight
實(shí)例化 car01=Car(5)
實(shí)例對象調(diào)用 car01.weght
我們在構(gòu)造類時,Python3默認(rèn)我們繼承了object這個基類,我個人理解object就是個空的類,可以不用管為何要在括號中寫上object,這是Python3的特性,在python2中如果你沒有寫object的話不會默認(rèn)繼承了object這個基類。
同樣的我們自己希望繼承的父類只需要把objetc改為我們自己定義的類名即可。子類中可以擁有父類中所有的公有屬性和方法,但是可以通過在變量名前加下劃線使其變?yōu)樗接?,這樣子類就不可以訪問父類中的成員了。
以下三個公交車類的父類均為客車類,我們可以寫一個funcs方法使得每次調(diào)用funcs方法時,傳入不同的對象以執(zhí)行不同的func方法,具體實(shí)現(xiàn)如下:
主函數(shù) :
可以看到,我將小 汽車 實(shí)例化為帶有重量為5t的一個具體對象,將客車實(shí)例化為帶有重量為20t的一個具體對象,將三個公交車實(shí)例化為帶有重量為15t的一個具體對象.
如上圖所示,我每次在調(diào)用funcs方法時都傳入了一個實(shí)例化對象,funcs根據(jù)不同的對象執(zhí)行相應(yīng)的內(nèi)部方法。
Python中的多態(tài)?
times函數(shù)為例談?wù)劧鄳B(tài),就像我們看到的那樣,times函數(shù)中表達(dá)式×*y的意義完全取決于x和y的對象類型,同樣的函數(shù),在一個實(shí)例下執(zhí)行的是乘法,在另一個實(shí)例下執(zhí)行的卻是重復(fù)。Python把對某一對象在某種語法下的合理性交給那個對象自身來判斷。實(shí)際上,*作為一個分派機(jī)制,將執(zhí)行的控制權(quán)移交給被處理的對象。
這種依賴類型的行為稱為多態(tài),其含義就是一個操作的意義取決于被操作對象的類型。因?yàn)镻ython是動態(tài)類型語言,所以多態(tài)在Python中隨處可見。事實(shí)上,在 Python中所有操作都是多態(tài)的操作:print、index、*運(yùn)算符,以及更多。這實(shí)際上是有意而為的,并且從很大程度上算作是這門語言簡潔性和靈活性的一個表現(xiàn)。例如,函數(shù)可以自動地應(yīng)用到所有類別的對象上。只要對象支持所預(yù)期的接口(也稱為協(xié)議),函數(shù)就能處理它們。也就是說,如果傳給函數(shù)的對象支持預(yù)期的方法和表達(dá)式運(yùn)算符,那么它們對函數(shù)的邏輯來說就是有著即插即用的兼容性。
即使是簡單的times 函數(shù),對任意兩個支持*的對象都可以執(zhí)行,無論它是哪種類型,也不管它是何時編寫的。這個函數(shù)對于數(shù)字來說是有效的(執(zhí)行乘法),或者一個字符串和一個數(shù)字(執(zhí)行重復(fù)),或者任意其他支持?jǐn)U展接口的兼容對象——甚至是我們尚未編寫過的基于類的對象。
網(wǎng)站標(biāo)題:python函數(shù)多態(tài) python 虛函數(shù) 多態(tài)
瀏覽路徑:http://fisionsoft.com.cn/article/hhdsch.html