国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

跟老齊學(xué)Python之關(guān)于類的初步認(rèn)識(shí)

2019-11-25 18:08:51
字體:
供稿:網(wǎng)友

在開始部分,請(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)樗軌蜃屓藗兏?jiǎn)單地設(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,簡(jiǎn)稱OOD)方面的知識(shí)。

下面再引用一段來自維基百科中關(guān)于OOP的歷史。

復(fù)制代碼 代碼如下:

面向?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ū)ο蠓椒èD―不同于Smalltalk與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)系呢?

維基百科中這樣定義了類:

復(fù)制代碼 代碼如下:

在面向?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è)類:

復(fù)制代碼 代碼如下:

class Human:        #這是定義類的方法,通常類的名稱用首字母大寫的單詞或者單詞拼接
    pass

 好,現(xiàn)在就從這里開始,編寫一個(gè)類,不過這次我們暫時(shí)不用python,而是用偽代碼,當(dāng)然,這個(gè)代碼跟python相去甚遠(yuǎn)。如下:

復(fù)制代碼 代碼如下:

class Human:
    四肢
    性格
    愛好
    學(xué)習(xí)()

 對(duì)象(Object)是類的實(shí)例。剛才已經(jīng)定義了一個(gè)名字為Human的類,從而定義了世界上所有的Human,但是這是一個(gè)抽象的Human,不是具體某個(gè)人。而對(duì)一個(gè)具體的人,他的四肢特點(diǎn)、性格、愛好等都是具體的,這些東西在這里被稱之為屬性。

下面就找一個(gè)具體的人:王二麻子,把上面的類實(shí)例化。
王二麻子 = Human()
王二麻子.四肢 = 修長(zhǎng)
王二麻子.愛好 = 看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)容不多,盼望看官能理解。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南郑县| 宁海县| 睢宁县| 昭通市| 城步| 抚远县| 惠东县| 武宁县| 奎屯市| 青龙| 当雄县| 都昌县| 双柏县| 邳州市| 津市市| 赤峰市| 民权县| 荣成市| 苍溪县| 兴海县| 无极县| 怀来县| 双江| 旬阳县| 紫阳县| 剑川县| 郁南县| 亳州市| 石家庄市| 安达市| 丹寨县| 周宁县| 怀来县| 武宁县| 水富县| 商都县| 永济市| 东山县| 荆门市| 尉氏县| 浦城县|