在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 類(1)
標(biāo)準(zhǔn)庫 (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫 (6)
標(biāo)準(zhǔn)庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語句(1)
數(shù)和四則運(yùn)算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級
字符串(3)
為計算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫 (2)
列表(2)
元組

類(1)

類,這個詞如果是你第一次聽到,把它作為一個單獨(dú)的名詞,總感覺怪怪的,因?yàn)樵跐h語體系中,很常見的是說“鳥類”、“人類”等詞語,而單獨(dú)說“類”,總感覺前面缺點(diǎn)修飾成分。其實(shí),它對應(yīng)的是英文單詞 class,“類”是這個 class 翻譯過來的,你就把它作為一個翻譯術(shù)語吧。

除了“類”這個術(shù)語,從現(xiàn)在開始,還要經(jīng)常提到一個 OOP,即面向?qū)ο缶幊蹋ɑ蛘摺懊嫦驅(qū)ο蟪绦蛟O(shè)計”)。

為了理解類和 OOP,需要對一些枯燥的名詞有了解。

術(shù)語

必須了解這些術(shù)語的基本含義,因?yàn)楹竺娼?jīng)常用到。下面的術(shù)語定義均來自維基百科。

問題空間

定義:

問題空間是問題解決者對一個問題所達(dá)到的全部認(rèn)識狀態(tài),它是由問題解決者利用問題所包含的信息和已貯存的信息主動地構(gòu)成的。

一個問題一般有下面三個方面來定義:

  • 初始狀態(tài)——一開始時的不完全的信息或令人不滿意的狀況;
  • 目標(biāo)狀態(tài)——你希望獲得的信息或狀態(tài);
  • 操作——為了從初始狀態(tài)邁向目標(biāo)狀態(tài),你可能采取的步驟。

這三個部分加在一起定義了問題空間(problem space)。

對象

定義:

對象(object),臺灣譯作物件,是面向?qū)ο螅∣bject Oriented)中的術(shù)語,既表示客觀世界問題空間(Namespace)中的某個具體的事物,又表示軟件系統(tǒng)解空間中的基本元素。

把 object 翻譯為“對象”,是比較抽象的。因此,有人認(rèn)為,不如翻譯為“物件”更好。因?yàn)椤拔锛弊屓烁械揭环N具體的東西。

這種看法在某些語言中是非常適合的。但是,在 Python 中,則無所謂,不管怎樣,Python 中的一切都是對象,不管是字符串、函數(shù)、模塊還是類,都是對象。“萬物皆對象”。

都是對象有什么優(yōu)勢嗎?太有了。這說明 Python 天生就是 OOP 的。也說明,Python 中的所有東西,都能夠進(jìn)行拼湊組合應(yīng)用,因?yàn)閷ο缶褪强梢云礈惤M合應(yīng)用的。

對于對象這個東西,OOP 大師 Grandy Booch 的定義,應(yīng)該是權(quán)威的,相關(guān)定義的內(nèi)容包括:

  • 對象:一個對象有自己的狀態(tài)、行為和唯一的標(biāo)識;所有相同類型的對象所具有的結(jié)構(gòu)和行為在他們共同的類中被定義。
  • 狀態(tài)(state):包括這個對象已有的屬性(通常是類里面已經(jīng)定義好的)在加上對象具有的當(dāng)前屬性值(這些屬性往往是動態(tài)的)
  • 行為(behavior):是指一個對象如何影響外界及被外界影響,表現(xiàn)為對象自身狀態(tài)的改變和信息的傳遞。
  • 標(biāo)識(identity):是指一個對象所具有的區(qū)別于所有其它對象的屬性。(本質(zhì)上指內(nèi)存中所創(chuàng)建的對象的地址)

大師的話的確有水平,聽起來非常高深。不過,初學(xué)者可能理解起來就有點(diǎn)麻煩了。我就把大師的話化簡一下,但是化簡了之后可能在嚴(yán)謹(jǐn)性上就不足了,我想對于初學(xué)者來講,應(yīng)該是影響不很大的。隨著學(xué)習(xí)和時間的深入,就更能理解大師的嚴(yán)謹(jǐn)描述了。

簡化之,對象應(yīng)該具有屬性(就是上面的狀態(tài),因?yàn)閷傩愿S茫?、方法(就是上面的行為,方法跟常被使用)和?biāo)識。因?yàn)闃?biāo)識是內(nèi)存中自動完成的,所以,平時不用怎么管理它。主要就是屬性和方法。

任何一個對象都要包括這兩部分:屬性(是什么)和方法(能做什么)。

面向?qū)ο?/h3>

定義:

面向?qū)ο蟪绦蛟O(shè)計(英語:Object-oriented programming,縮寫:OOP)是一種程序設(shè)計范型,同時也是一種程序開發(fā)的方法。對象指的是類的實(shí)例。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性。

面向?qū)ο蟪绦蛟O(shè)計可以看作一種在程序中包含各種獨(dú)立而又互相調(diào)用的對象的思想,這與傳統(tǒng)的思想剛好相反:傳統(tǒng)的程序設(shè)計主張將程序看作一系列函數(shù)的集合,或者直接就是一系列對電腦下達(dá)的指令。面向?qū)ο蟪绦蛟O(shè)計中的每一個對象都應(yīng)該能夠接受數(shù)據(jù)、處理數(shù)據(jù)并將數(shù)據(jù)傳達(dá)給其它對象,因此它們都可以被看作一個小型的“機(jī)器”,即對象。

目前已經(jīng)被證實(shí)的是,面向?qū)ο蟪绦蛟O(shè)計推廣了程序的靈活性和可維護(hù)性,并且在大型項(xiàng)目設(shè)計中廣為應(yīng)用。 此外,支持者聲稱面向?qū)ο蟪绦蛟O(shè)計要比以往的做法更加便于學(xué)習(xí),因?yàn)樗軌蜃屓藗兏唵蔚卦O(shè)計并維護(hù)程序,使得程序更加便于分析、設(shè)計、理解。反對者在某些領(lǐng)域?qū)Υ擞枰苑裾J(rèn)。

當(dāng)我們提到面向?qū)ο蟮臅r候,它不僅指一種程序設(shè)計方法。它更多意義上是一種程序開發(fā)方式。在這一方面,我們必須了解更多關(guān)于面向?qū)ο笙到y(tǒng)分析和面向?qū)ο笤O(shè)計(Object Oriented Design,簡稱 OOD)方面的知識。

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

面向?qū)ο蟪绦蛟O(shè)計的雛形,早在 1960 年的 Simula 語言中即可發(fā)現(xiàn),當(dāng)時的程序設(shè)計領(lǐng)域正面臨著一種危機(jī):在軟硬件環(huán)境逐漸復(fù)雜的情況下,軟件如何得到良好的維護(hù)?面向?qū)ο蟪绦蛟O(shè)計在某種程度上通過強(qiáng)調(diào)可重復(fù)性解決了這一問題。20 世紀(jì) 70 年代的 Smalltalk 語言在面向?qū)ο蠓矫婵胺Q經(jīng)典——以至于 30 年后的今天依然將這一語言視為面向?qū)ο笳Z言的基礎(chǔ)。

計算機(jī)科學(xué)中對象和實(shí)例概念的最早萌芽可以追溯到麻省理工學(xué)院的 PDP-1 系統(tǒng)。這一系統(tǒng)大概是最早的基于容量架構(gòu)(capability based architecture)的實(shí)際系統(tǒng)。另外 1963 年 Ivan Sutherland 的 Sketchpad 應(yīng)用中也蘊(yùn)含了同樣的思想。對象作為編程實(shí)體最早是于 1960 年代由 Simula 67 語言引入思維。Simula 這一語言是奧利-約翰·達(dá)爾和克利斯登·奈加特在挪威奧斯陸計算機(jī)中心為模擬環(huán)境而設(shè)計的。(據(jù)說,他們是為了模擬船只而設(shè)計的這種語言,并且對不同船只間屬性的相互影響感興趣。他們將不同的船只歸納為不同的類,而每一個對象,基于它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程序的最早概念體現(xiàn)。在分析式程序中,我們將真實(shí)世界的對象映射到抽象的對象,這叫做“模擬”。Simula 不僅引入了“類”的概念,還應(yīng)用了實(shí)例這一思想——這可能是這些概念的最早應(yīng)用。

20 世紀(jì) 70 年代施樂 PARC 研究所發(fā)明的 Smalltalk 語言將面向?qū)ο蟪绦蛟O(shè)計的概念定義為,在基礎(chǔ)運(yùn)算中,對對象和消息的廣泛應(yīng)用。Smalltalk 的創(chuàng)建者深受 Simula 67 的主要思想影響,但 Smalltalk 中的對象是完全動態(tài)的——它們可以被創(chuàng)建、修改并銷毀,這與 Simula 中的靜態(tài)對象有所區(qū)別。此外,Smalltalk 還引入了繼承性的思想,它因此一舉超越了不可創(chuàng)建實(shí)例的程序設(shè)計模型和不具備繼承性的 Simula。此外,Simula 67 的思想亦被應(yīng)用在許多不同的語言,如 Lisp、Pascal。

面向?qū)ο蟪绦蛟O(shè)計在 80 年代成為了一種主導(dǎo)思想,這主要應(yīng)歸功于 C++——C 語言的擴(kuò)充版。在圖形用戶界面(GUI)日漸崛起的情況下,面向?qū)ο蟪绦蛟O(shè)計很好地適應(yīng)了潮流。GUI 和面向?qū)ο蟪绦蛟O(shè)計的緊密關(guān)聯(lián)在 Mac OS X 中可見一斑。Mac OS X 是由 Objective-C 語言寫成的,這一語言是一個仿 Smalltalk 的 C 語言擴(kuò)充版。面向?qū)ο蟪绦蛟O(shè)計的思想也使事件處理式的程序設(shè)計更加廣泛被應(yīng)用(雖然這一概念并非僅存在于面向?qū)ο蟪绦蛟O(shè)計)。一種說法是,GUI 的引入極大地推動了面向?qū)ο蟪绦蛟O(shè)計的發(fā)展。

蘇黎世聯(lián)邦理工學(xué)院的尼克勞斯·維爾特和他的同事們對抽象數(shù)據(jù)和模塊化程序設(shè)計進(jìn)行了研究。Modula-2 將這些都包括了進(jìn)去,而 Oberon 則包括了一種特殊的面向?qū)ο蠓椒ā煌?Smalltalk 與 C++。

面向?qū)ο蟮奶匦砸脖患尤肓水?dāng)時較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal 以及種種。由于這些語言最初并沒有面向?qū)ο蟮脑O(shè)計,故而這種糅合常常會導(dǎo)致兼容性和維護(hù)性的問題。與之相反的是,“純正的”面向?qū)ο笳Z言卻缺乏一些程序員們賴以生存的特性。在這一大環(huán)境下,開發(fā)新的語言成為了當(dāng)務(wù)之急。作為先行者,Eiffel 成功地解決了這些問題,并成為了當(dāng)時較受歡迎的語言。

在過去的幾年中,Java 語言成為了廣為應(yīng)用的語言,除了它與 C 和 C++ 語法上的近似性。Java 的可移植性是它的成功中不可磨滅的一步,因?yàn)檫@一特性,已吸引了龐大的程序員群的投入。

在最近的計算機(jī)語言發(fā)展中,一些既支持面向?qū)ο蟪绦蛟O(shè)計,又支持面向過程程序設(shè)計的語言悄然浮出水面。它們中的佼佼者有 Python、Ruby 等等。

正如面向過程程序設(shè)計使得結(jié)構(gòu)化程序設(shè)計的技術(shù)得以提升,現(xiàn)代的面向?qū)ο蟪绦蛟O(shè)計方法使得對設(shè)計模式的用途、契約式設(shè)計和建模語言(如 UML)技術(shù)也得到了一定提升。

列位看官,當(dāng)您閱讀到這句話的時候,我就姑且認(rèn)為您已經(jīng)對面向?qū)ο笥辛艘粋€模糊的認(rèn)識了。那么,類和 OOP 有什么關(guān)系呢?

定義:

在面向?qū)ο蟪淌皆O(shè)計,類(class)是一種面向?qū)ο笥嬎銠C(jī)編程語言的構(gòu)造,是創(chuàng)建對象的藍(lán)圖,描述了所創(chuàng)建的對象共同的屬性和方法。

類的更嚴(yán)格的定義是由某種特定的元數(shù)據(jù)所組成的內(nèi)聚的包。它描述了一些對象的行為規(guī)則,而這些對象就被稱為該類的實(shí)例。類有接口和結(jié)構(gòu)。接口描述了如何通過方法與類及其實(shí)例互操作,而結(jié)構(gòu)描述了一個實(shí)例中數(shù)據(jù)如何劃分為多個屬性。類是與某個層的對象的最具體的類型。類還可以有運(yùn)行時表示形式(元對象),它為操作與類相關(guān)的元數(shù)據(jù)提供了運(yùn)行時支持。

支持類的編程語言在支持與類相關(guān)的各種特性方面都多多少少有一些微妙的差異。大多數(shù)都支持不同形式的類繼承。許多語言還支持提供封裝性的特性,比如訪問修飾符。類的出現(xiàn),為面向?qū)ο缶幊痰娜齻€最重要的特性(封裝性,繼承性,多態(tài)性),提供了實(shí)現(xiàn)的手段。

看到這里,看官或許有一個認(rèn)識,要 OOP 編程,就得用到類??梢赃@么說,雖然不是很嚴(yán)格。但是,反過來就不能說了。不是說用了類就一定是 OOP。

編寫類

首先要明確,類是對某一群具有同樣屬性和方法的對象的抽象。比如這個世界上有很多長翅膀并且會飛的生物,于是聰明的人們就將它們統(tǒng)一稱為“鳥”——這就是一個類,雖然它也可以稱作“鳥類”。

還是以美女為例子,因?yàn)檫@個例子不僅能閱讀本課程不犯困,還能興趣昂然。

要定義類,就要抽象,找出共同的方面。

class 美女:        #用 class 來聲明,后面定義的是一個類
    pass

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

class 美女:
    胸圍 = 90
    腰圍 = 58
    臀圍 = 83
    皮膚 = white
    唱歌()
    做飯()

定義了一個名稱為“美女”的類,其中我約定,沒有括號的是屬性,帶有括號的是方法。這個類僅僅是對美女的通常抽象,并不是某個具體美女.

對于一個具體的美女,比如前面提到的蒼老師或者王美女,她們都是上面所定義的“美女”那個類的具體化,這在編程中稱為“美女類”的實(shí)例。

王美女 = 美女()

我用這樣一種表達(dá)方式,就是將“美女類”實(shí)例化了,對“王美女”這個實(shí)例,就可以具體化一些屬性,比如胸圍;還可以具體實(shí)施一些方法,比如做飯。通??梢杂眠@樣一種方式表示:

a = 王美女.胸圍

用點(diǎn)號.的方式,表示王美女胸圍的屬性,得到的變量 a 就是 90.另外,還可以通過這種方式給屬性賦值,比如

王美女.皮膚 = black

這樣,這個實(shí)例(王美女)的皮膚就是黑色的了。

通過實(shí)例,也可以訪問某個方法,比如:

王美女.做飯()

這就是在執(zhí)行一個方法,讓王美女這個實(shí)例做飯?,F(xiàn)在也比較好理解了,只有一個具體的實(shí)例才能做飯。

至此,你是否對類和實(shí)例,類的屬性和方法有初步理解了呢?


總目錄   |   上節(jié):函數(shù)練習(xí)   |   下節(jié):類(2)

如果你認(rèn)為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。