跟老齊學(xué)Python之關(guān)于類的初步認(rèn)識(shí)
在開始部分,請(qǐng)看官非常非常耐心地閱讀下面幾個(gè)枯燥的術(shù)語解釋,本來這不符合本教程的風(fēng)格,但是,請(qǐng)看官諒解,因?yàn)榱形粚硪欢ㄒ喿x枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。
1、問題空間
問題空間是問題解決者對(duì)一個(gè)問題所達(dá)到的全部認(rèn)識(shí)狀態(tài),它是由問題解決者利用問題所包含的信息和已貯存的信息主動(dòng)地構(gòu)成的。
一個(gè)問題一般有下面三個(gè)方面來定義:
•初始狀態(tài)——一開始時(shí)的不完全的信息或令人不滿意的狀況;
•目標(biāo)狀態(tài)——你希望獲得的信息或狀態(tài);
•操作——為了從初始狀態(tài)邁向目標(biāo)狀態(tài),你可能采取的步驟。
這三個(gè)部分加在一起定義了問題空間(problem space)。
2、對(duì)象
對(duì)象(object),臺(tái)灣譯作物件,是面向?qū)ο螅∣bject Oriented)中的術(shù)語,既表示客觀世界問題空間(Namespace)中的某個(gè)具體的事物,又表示軟件系統(tǒng)解空間中的基本元素。
在軟件系統(tǒng)中,對(duì)象具有唯一的標(biāo)識(shí)符,對(duì)象包括屬性(Properties)和方法(Methods),屬性就是需要記憶的信息,方法就是對(duì)象能夠提供的服務(wù)。在面向?qū)ο螅∣bject Oriented)的軟件中,對(duì)象(Object)是某一個(gè)類(Class)的實(shí)例(Instance)。
3、面向?qū)ο?/p>
面向?qū)ο蟪绦蛟O(shè)計(jì)(英語:Object-oriented programming,縮寫:OOP)是一種程序設(shè)計(jì)范型,同時(shí)也是一種程序開發(fā)的方法。對(duì)象指的是類的實(shí)例。它將對(duì)象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性。
面向?qū)ο蟪绦蛟O(shè)計(jì)可以看作一種在程序中包含各種獨(dú)立而又互相調(diào)用的對(duì)象的思想,這與傳統(tǒng)的思想剛好相反:傳統(tǒng)的程序設(shè)計(jì)主張將程序看作一系列函數(shù)的集合,或者直接就是一系列對(duì)電腦下達(dá)的指令。面向?qū)ο蟪绦蛟O(shè)計(jì)中的每一個(gè)對(duì)象都應(yīng)該能夠接受數(shù)據(jù)、處理數(shù)據(jù)并將數(shù)據(jù)傳達(dá)給其它對(duì)象,因此它們都可以被看作一個(gè)小型的“機(jī)器”,即對(duì)象。
目前已經(jīng)被證實(shí)的是,面向?qū)ο蟪绦蛟O(shè)計(jì)推廣了程序的靈活性和可維護(hù)性,并且在大型項(xiàng)目設(shè)計(jì)中廣為應(yīng)用。 此外,支持者聲稱面向?qū)ο蟪绦蛟O(shè)計(jì)要比以往的做法更加便于學(xué)習(xí),因?yàn)樗軌蜃屓藗兏唵蔚卦O(shè)計(jì)并維護(hù)程序,使得程序更加便于分析、設(shè)計(jì)、理解。反對(duì)者在某些領(lǐng)域?qū)Υ擞枰苑裾J(rèn)。
當(dāng)我們提到面向?qū)ο蟮臅r(shí)候,它不僅指一種程序設(shè)計(jì)方法。它更多意義上是一種程序開發(fā)方式。在這一方面,我們必須了解更多關(guān)于面向?qū)ο笙到y(tǒng)分析和面向?qū)ο笤O(shè)計(jì)(Object Oriented Design,簡稱OOD)方面的知識(shí)。
下面再引用一段來自維基百科中關(guān)于OOP的歷史。
面向?qū)ο蟪绦蛟O(shè)計(jì)的雛形,早在1960年的Simula語言中即可發(fā)現(xiàn),當(dāng)時(shí)的程序設(shè)計(jì)領(lǐng)域正面臨著一種危機(jī):在軟硬件環(huán)境逐漸復(fù)雜的情況下,軟件如何得到良好的維護(hù)?面向?qū)ο蟪绦蛟O(shè)計(jì)在某種程度上通過強(qiáng)調(diào)可重復(fù)性解決了這一問題。20世紀(jì)70年代的Smalltalk語言在面向?qū)ο蠓矫婵胺Q經(jīng)典——以至于30年后的今天依然將這一語言視為面向?qū)ο笳Z言的基礎(chǔ)。
計(jì)算機(jī)科學(xué)中對(duì)象和實(shí)例概念的最早萌芽可以追溯到麻省理工學(xué)院的PDP-1系統(tǒng)。這一系統(tǒng)大概是最早的基于容量架構(gòu)(capability based architecture)的實(shí)際系統(tǒng)。另外1963年Ivan Sutherland的Sketchpad應(yīng)用中也蘊(yùn)含了同樣的思想。對(duì)象作為編程實(shí)體最早是于1960年代由Simula 67語言引入思維。Simula這一語言是奧利-約翰·達(dá)爾和克利斯登·奈加特在挪威奧斯陸計(jì)算機(jī)中心為模擬環(huán)境而設(shè)計(jì)的。(據(jù)說,他們是為了模擬船只而設(shè)計(jì)的這種語言,并且對(duì)不同船只間屬性的相互影響感興趣。他們將不同的船只歸納為不同的類,而每一個(gè)對(duì)象,基于它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程序的最早概念體現(xiàn)。在分析式程序中,我們將真實(shí)世界的對(duì)象映射到抽象的對(duì)象,這叫做“模擬”。Simula不僅引入了“類”的概念,還應(yīng)用了實(shí)例這一思想——這可能是這些概念的最早應(yīng)用。
20世紀(jì)70年代施樂PARC研究所發(fā)明的Smalltalk語言將面向?qū)ο蟪绦蛟O(shè)計(jì)的概念定義為,在基礎(chǔ)運(yùn)算中,對(duì)對(duì)象和消息的廣泛應(yīng)用。Smalltalk的創(chuàng)建者深受Simula 67的主要思想影響,但Smalltalk中的對(duì)象是完全動(dòng)態(tài)的——它們可以被創(chuàng)建、修改并銷毀,這與Simula中的靜態(tài)對(duì)象有所區(qū)別。此外,Smalltalk還引入了繼承性的思想,它因此一舉超越了不可創(chuàng)建實(shí)例的程序設(shè)計(jì)模型和不具備繼承性的Simula。此外,Simula 67的思想亦被應(yīng)用在許多不同的語言,如Lisp、Pascal。
面向?qū)ο蟪绦蛟O(shè)計(jì)在80年代成為了一種主導(dǎo)思想,這主要應(yīng)歸功于C++——C語言的擴(kuò)充版。在圖形用戶界面(GUI)日漸崛起的情況下,面向?qū)ο蟪绦蛟O(shè)計(jì)很好地適應(yīng)了潮流。GUI和面向?qū)ο蟪绦蛟O(shè)計(jì)的緊密關(guān)聯(lián)在Mac OS X中可見一斑。Mac OS X是由Objective-C語言寫成的,這一語言是一個(gè)仿Smalltalk的C語言擴(kuò)充版。面向?qū)ο蟪绦蛟O(shè)計(jì)的思想也使事件處理式的程序設(shè)計(jì)更加廣泛被應(yīng)用(雖然這一概念并非僅存在于面向?qū)ο蟪绦蛟O(shè)計(jì))。一種說法是,GUI的引入極大地推動(dòng)了面向?qū)ο蟪绦蛟O(shè)計(jì)的發(fā)展。
蘇黎世聯(lián)邦理工學(xué)院的尼克勞斯·維爾特和他的同事們對(duì)抽象數(shù)據(jù)和模塊化程序設(shè)計(jì)進(jìn)行了研究。Modula-2將這些都包括了進(jìn)去,而Oberon則包括了一種特殊的面向?qū)ο蠓椒ā煌赟malltalk與C++。
面向?qū)ο蟮奶匦砸脖患尤肓水?dāng)時(shí)較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal以及種種。由于這些語言最初并沒有面向?qū)ο蟮脑O(shè)計(jì),故而這種糅合常常會(huì)導(dǎo)致兼容性和維護(hù)性的問題。與之相反的是,“純正的”面向?qū)ο笳Z言卻缺乏一些程序員們賴以生存的特性。在這一大環(huán)境下,開發(fā)新的語言成為了當(dāng)務(wù)之急。作為先行者,Eiffel成功地解決了這些問題,并成為了當(dāng)時(shí)較受歡迎的語言。
在過去的幾年中,Java語言成為了廣為應(yīng)用的語言,除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步,因?yàn)檫@一特性,已吸引了龐大的程序員群的投入。
在最近的計(jì)算機(jī)語言發(fā)展中,一些既支持面向?qū)ο蟪绦蛟O(shè)計(jì),又支持面向過程程序設(shè)計(jì)的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等。
正如面向過程程序設(shè)計(jì)使得結(jié)構(gòu)化程序設(shè)計(jì)的技術(shù)得以提升,現(xiàn)代的面向?qū)ο蟪绦蛟O(shè)計(jì)方法使得對(duì)設(shè)計(jì)模式的用途、契約式設(shè)計(jì)和建模語言(如UML)技術(shù)也得到了一定提升。
列位看官,當(dāng)您閱讀到這句話的時(shí)候,我就姑且認(rèn)為您已經(jīng)對(duì)面向?qū)ο笥辛艘粋€(gè)模糊的認(rèn)識(shí)了。那么,類和OOP有什么關(guān)系呢?
維基百科中這樣定義了類:
在面向?qū)ο蟪淌皆O(shè)計(jì),類(class)是一種面向?qū)ο笥?jì)算機(jī)編程語言的構(gòu)造,是創(chuàng)建對(duì)象的藍(lán)圖,描述了所創(chuàng)建的對(duì)象共同的屬性和方法。
類的更嚴(yán)格的定義是由某種特定的元數(shù)據(jù)所組成的內(nèi)聚的包。它描述了一些對(duì)象的行為規(guī)則,而這些對(duì)象就被稱為該類的實(shí)例。類有接口和結(jié)構(gòu)。接口描述了如何通過方法與類及其實(shí)例互操作,而結(jié)構(gòu)描述了一個(gè)實(shí)例中數(shù)據(jù)如何劃分為多個(gè)屬性。類是與某個(gè)層的對(duì)象的最具體的類型。類還可以有運(yùn)行時(shí)表示形式(元對(duì)象),它為操作與類相關(guān)的元數(shù)據(jù)提供了運(yùn)行時(shí)支持。
支持類的編程語言在支持與類相關(guān)的各種特性方面都多多少少有一些微妙的差異。大多數(shù)都支持不同形式的類繼承。許多語言還支持提供封裝性的特性,比如訪問修飾符。類的出現(xiàn),為面向?qū)ο缶幊痰娜齻€(gè)最重要的特性(封裝性,繼承性,多態(tài)性),提供了實(shí)現(xiàn)的手段。
看到這里,看官或許有一個(gè)認(rèn)識(shí),要OOP編程,就得用到類??梢赃@么說,雖然不是很嚴(yán)格。但是,反過來就不能說了。不是說用了類就一定是OOP。
編寫類
對(duì)類的理解,需要看官有一定的抽象思維。因?yàn)轭悾–lass)本身所定義的是某事物的抽象特點(diǎn)。例如定義一個(gè)類:
class Human: #這是定義類的方法,通常類的名稱用首字母大寫的單詞或者單詞拼接
pass
好,現(xiàn)在就從這里開始,編寫一個(gè)類,不過這次我們暫時(shí)不用python,而是用偽代碼,當(dāng)然,這個(gè)代碼跟python相去甚遠(yuǎn)。如下:
class Human:
四肢
性格
愛好
學(xué)習(xí)()
對(duì)象(Object)是類的實(shí)例。剛才已經(jīng)定義了一個(gè)名字為Human的類,從而定義了世界上所有的Human,但是這是一個(gè)抽象的Human,不是具體某個(gè)人。而對(duì)一個(gè)具體的人,他的四肢特點(diǎn)、性格、愛好等都是具體的,這些東西在這里被稱之為屬性。
下面就找一個(gè)具體的人:王二麻子,把上面的類實(shí)例化。
王二麻子 = Human()
王二麻子.四肢 = 修長
王二麻子.愛好 = 看MM
在這里,王二麻子就是Human這個(gè)類的一個(gè)實(shí)例。一個(gè)具體對(duì)象屬性的值被稱作它的“狀態(tài)”。(系統(tǒng)給對(duì)象分配內(nèi)存空間,而不會(huì)給類分配內(nèi)存空間,這很好理解,類是抽象的系統(tǒng)不可能給抽象的東西分配空間,對(duì)象是具體的)
行文至此,看官是不是大概對(duì)類有了一個(gè)模糊的認(rèn)識(shí)了呢?
鑒于類,距離我們的直觀感覺似乎有點(diǎn)遠(yuǎn)。所以,要慢慢道來。本講內(nèi)容不多,盼望看官能理解。
相關(guān)文章
Python實(shí)現(xiàn)PS圖像調(diào)整顏色梯度效果示例
這篇文章主要介紹了Python實(shí)現(xiàn)PS圖像調(diào)整顏色梯度效果,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)PS圖像調(diào)整中顏色梯度的原理與相關(guān)操作技巧,需要的朋友可以參考下2018-01-01基于django和dropzone.js實(shí)現(xiàn)上傳文件
這篇文章主要介紹了基于django和dropzone.js實(shí)現(xiàn)上傳文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python實(shí)現(xiàn)分段讀取和保存遙感數(shù)據(jù)
當(dāng)遇到批量讀取大量遙感數(shù)據(jù)進(jìn)行運(yùn)算的時(shí)候,如果不進(jìn)行分段讀取操作的話,電腦內(nèi)存可能面臨著不夠使用的情況,所以我們要進(jìn)行分段讀取數(shù)據(jù)然后進(jìn)行運(yùn)算,運(yùn)算結(jié)束之后把這段數(shù)據(jù)保存成tif文件,本文介紹了Python實(shí)現(xiàn)分段讀取和保存遙感數(shù)據(jù),需要的朋友可以參考下2023-08-08pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列
這篇文章主要介紹了pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-07-07