python是面向?qū)ο蟮?。Python語言在設(shè)計(jì)之初,就定位為一門面向?qū)ο蟮木幊陶Z言,“Python中一切皆對象”就是對Pytho 這門編程語言的完美詮釋。類和對象是Python的重要特征,相比其它面向?qū)ο笳Z言,Python很容易就可以創(chuàng)建出一個(gè)類和對象;同時(shí),Python也支持面向?qū)ο蟮娜筇卣鳎悍庋b、繼承和多態(tài)。
本教程操作環(huán)境:windows7系統(tǒng)、python3版,DELL G3電腦
Python雖然是解釋型語言,但Python 語言在設(shè)計(jì)之初,就定位為一門面向?qū)ο蟮木幊陶Z言,“Python 中一切皆對象”就是對 Python 這門編程語言的完美詮釋。
什么是面向?qū)ο?/span>
面向?qū)ο缶幊淌窃诿嫦蜻^程編程的基礎(chǔ)上發(fā)展來的,它比面向過程編程具有更強(qiáng)的靈活性和擴(kuò)展性。面向?qū)ο缶幊淌浅绦騿T發(fā)展的分水嶺,很多初學(xué)者會(huì)因無法理解面向?qū)ο蠖艞墝W(xué)習(xí)編程。
面向?qū)ο缶幊蹋∣bject-oriented Programming,簡稱 OOP),是一種封裝代碼的方法。其實(shí),在前面章節(jié)的學(xué)習(xí)中,我們已經(jīng)接觸了封裝,比如說,將亂七八糟的數(shù)據(jù)扔進(jìn)列表中,這就是一種簡單的封裝,是數(shù)據(jù)層面的封裝;把常用的代碼塊打包成一個(gè)函數(shù),這也是一種封裝,是語句層面的封裝。
代碼封裝,其實(shí)就是隱藏實(shí)現(xiàn)功能的具體代碼,僅留給用戶使用的接口,就好像使用計(jì)算機(jī),用戶只需要使用鍵盤、鼠標(biāo)就可以實(shí)現(xiàn)一些功能,而根本不需要知道其內(nèi)部是如何工作的。
面向?qū)ο缶幊?,也是一種封裝的思想,不過顯然比以上兩種封裝更先進(jìn),它可以更好地模擬真實(shí)世界里的事物(將其視為對象),并把描述特征的數(shù)據(jù)和代碼塊(函數(shù))封裝到一起。
打個(gè)比方,若在某游戲中設(shè)計(jì)一個(gè)烏龜?shù)慕巧瑧?yīng)該如何來實(shí)現(xiàn)呢?使用面向?qū)ο蟮乃枷霑?huì)更簡單,可以分為如下兩個(gè)方面進(jìn)行描述:
-
從表面特征來描述,例如,綠色的、有 4 條腿、重 10 kg、有外殼等等。
-
從所具有的的行為來描述,例如,它會(huì)爬、會(huì)吃東西、會(huì)睡覺、會(huì)將頭和四肢縮到殼里,等等。
如果將烏龜用代碼來表示,則其表面特征可以用變量來表示,其行為特征可以通過建立各種函數(shù)來表示。參考代碼如下所示:
class tortoise: bodyColor = "綠色" footNum = 4 weight = 10 hasShell = True #會(huì)爬 def crawl(self): print("烏龜會(huì)爬") #會(huì)吃東西 def eat(self): print("烏龜吃東西") #會(huì)睡覺 def sleep(self): print("烏龜在睡覺") #會(huì)縮到殼里 def protect(self): print("烏龜縮進(jìn)了殼里")
注意,以上代碼僅是為了演示面向?qū)ο蟮木幊趟枷搿?/p>
因此,從某種程序上,相比較只用變量或只用函數(shù),使用面向?qū)ο蟮乃枷肟梢愿玫啬M現(xiàn)實(shí)生活中的事物。
不僅如此,在 Python 中,所有的變量其實(shí)也都是對象,包括整形(int)、浮點(diǎn)型(float)、字符串(str)、列表(list)、元組(tuple)、字典(dict)和集合(set)。以字典(dict)為例,它包含多個(gè)函數(shù)供我們使用,例如使用 keys() 獲取字典中所有的鍵,使用 values() 獲取字典中所有的值,使用 item() 獲取字典中所有的鍵值對,等等。
面向?qū)ο笙嚓P(guān)術(shù)語
在系統(tǒng)學(xué)習(xí)面向?qū)ο缶幊讨?,初學(xué)者要了解有關(guān)面向?qū)ο蟮囊恍┬g(shù)語。當(dāng)和其他人討論代碼的時(shí)候,或者嘗試查找我們遇到的問題的解決方案時(shí),知道正確的術(shù)語會(huì)很有幫助。
面向?qū)ο笾?,常用術(shù)語包括:
-
類:可以理解是一個(gè)模板,通過它可以創(chuàng)建出無數(shù)個(gè)具體實(shí)例。比如,前面編寫的 tortoise 表示的只是烏龜這個(gè)物種,通過它可以創(chuàng)建出無數(shù)個(gè)實(shí)例來代表各種不同特征的烏龜(這一過程又稱為類的實(shí)例化)。
-
對象:類并不能直接使用,通過類創(chuàng)建出的實(shí)例(又稱對象)才能使用。這有點(diǎn)像汽車圖紙和汽車的關(guān)系,圖紙本身(類)并不能為人們使用,通過圖紙創(chuàng)建出的一輛輛車(對象)才能使用。
-
屬性:類中的所有變量稱為屬性。例如,tortoise 這個(gè)類中,bodyColor、footNum、weight、hasShell 都是這個(gè)類擁有的屬性。
-
方法:類中的所有函數(shù)通常稱為方法。不過,和函數(shù)所有不同的是,類方法至少要包含一個(gè) self 參數(shù)(后續(xù)會(huì)做詳細(xì)介紹)。例如,tortoise 類中,crawl()、eat()、sleep()、protect() 都是這個(gè)類所擁有的方法,類方法無法單獨(dú)使用,只能和類的對象一起使用。
Python的面向?qū)ο筇卣鳎?/span>
類和對象是 Python 的重要特征,相比其它面向?qū)ο笳Z言,Python 很容易就可以創(chuàng)建出一個(gè)類和對象。同時(shí),Python 也支持面向?qū)ο蟮娜筇卣鳎悍庋b、繼承和多態(tài)。
封裝
面向?qū)ο蟪绦蛟O(shè)計(jì)中的術(shù)語對象(Object)基本上可以看做數(shù)據(jù)(特性)以及由一系列可以存取、操作這些數(shù)據(jù)的方法所組成的集合。傳統(tǒng)意義上的“程序=
數(shù)據(jù)結(jié)構(gòu)+算法”被封裝”掩蓋“并簡化為“程序=對象+消息”。對象是類的實(shí)例,類的抽象則需要經(jīng)過封裝。封裝可以讓調(diào)用者不用關(guān)心對象是如何構(gòu)建的而直接進(jìn)行使用。
繼承
-
類繼承:
繼承給人的直接感覺是這是一種復(fù)用代碼的行為。繼承可以理解為它是以普通的類為基礎(chǔ)建立專門的類對象,子類和它繼承的父類是IS-A的關(guān)系。
-
多重繼承:
不同于C#,Python是支持多重類繼承的(C#可繼承自多個(gè)Interface,但最多繼承自一個(gè)類)。多重繼承機(jī)制有時(shí)很好用,但是它容易讓事情變得復(fù)雜。
多態(tài)
多態(tài)意味著可以對不同的對象使用同樣的操作,但它們可能會(huì)以多種形態(tài)呈現(xiàn)出結(jié)果。在Python中,任何不知道對象到底是什么類型,但又需要對象做點(diǎn)什么的時(shí)候,都會(huì)用到多態(tài)。方法是多態(tài)的,運(yùn)算符也是多態(tài)的。
【