【第八天】Python的類與對象.屬性

第四章

4.1

1.面向?qū)ο笳Z言(Object-Oriented-Language)的來歷

要想了解面向?qū)ο螅鸵葋砹私忸?Class)和對象(Object)
還記得面向過程中的模塊和函數(shù)嗎杆麸,它們提高了程序的可復用性
類和對象同樣提高了程序的可復用性,除此之外
類和對象這兩種語法結(jié)構(gòu)還加強了程序模擬真實世界的能力
“模擬”正是面向?qū)ο缶幊痰暮诵?/p>

py也是一門面向?qū)ο笳Z言顺又,比java的歷史更加悠久
只不過py允許程序員以純粹面向過程的方式來使用它
所以人們有時會忽視它那顆面向?qū)ο蟮男?/p>

沒有對象搞什么面向?qū)ο缶幊蘐_T

(c語言是面向結(jié)構(gòu)也就是面向過程
面向結(jié)構(gòu),是把要實現(xiàn)的功能分成很多模塊即函數(shù)
每個模塊承擔某一功能等孵,每個模塊可能會多次利用
這樣就只需調(diào)用函數(shù)就行稚照,不用重新定義,節(jié)省了代碼和時間
面向?qū)ο蟾┟龋俏覀儼岩獙崿F(xiàn)的功能打包封裝定義成一個類即一個對象
一個對象他既有多個屬性也有多個行為果录,用類作為程序設(shè)計的單元
要實現(xiàn)這個類的功能還得把類實現(xiàn),就是用類定義對象
就像面向結(jié)構(gòu)里的函數(shù)定義后绳瘟,你還得調(diào)用函數(shù)才能用函數(shù)的功能
類可以實現(xiàn)很多功能及對象的行為雕憔,也就是可以包含很多函數(shù)模塊和變量
類與類直接可以通信也就是屬性的傳遞就就是變量值的傳遞
這就比面向結(jié)構(gòu)更加抽象,抽象級別更高糖声。)

2.類

在日常生活中,我們把相似的東西歸為一類分瘦,并且給這個類起一個名字
比如說蘸泻,鳥類的共同屬性事有羽毛,通過產(chǎn)卵生育后代
任何一只特別的鳥類都是建立在鳥類的原型基礎(chǔ)上的

下面用py語言來記錄上面的想法嘲玫,描述鳥類:

class Bird(object):
    feather = True
    reproduction = 'egg'

在這里悦施,我們用關(guān)鍵字class來定義一個類,類的名字就是鳥(Bird)
括號里有一個關(guān)鍵詞object去团,也就是‘東西’的意思抡诞,即某個個體
在計算機語言中穷蛹,我們把個體稱為對象,一個類別下昼汗,可以有多個個體

冒號和縮進說明了屬于這個類的代碼肴熏,在隸屬于這個類別的程序塊中
我們定義了兩個量,一個用于說明鳥類有羽毛(feather)
另一個用于說明鳥類的繁衍方式(reproduction)
這兩個量稱為類的屬性(attribute)

我們除了用數(shù)據(jù)性的屬性來分辨類別外顷窒,有時也根據(jù)這類東西能做什么事情區(qū)分
這樣的一些行為屬性稱為方法(method)蛙吏,py中
一般通過在類的內(nèi)部定義函數(shù)來說明方法

class Bird(object):
    feather = True
    reproduction = 'egg'
    def chirp(self,sound):
        print(sound)

我們給鳥類新增一個方法屬性,就是表示鳥叫的方法chirp()
方法chirp()看起來很像個函數(shù)鞋吉,它的第一個參數(shù)是self
是為了

在方法內(nèi)部引用對象自身鸦做,(將在后面詳細解釋)

需要強調(diào)的是,無論該參數(shù)是否用到谓着,方法的第一個參數(shù)必須是用于指代對象自身的self
剩下的參數(shù)sound是為了滿足我們的需求設(shè)計的泼诱,它代表了鳥叫的內(nèi)容
方法chirp()會把sound打印出來

3.對象

我們定義了類,但和函數(shù)定義一樣赊锚,這還只是打造兵器的過程
為了使用這個利器治筒,我們需要深入到對象的層面
通過調(diào)用類,我們可以創(chuàng)造出這個類下面的一個對象
比如說改抡,我養(yǎng)了一只小鳥矢炼,叫summer,它是一個對象阿纤,且屬于鳥類
我們使用前面已經(jīng)定義好的鳥類句灌,產(chǎn)生這個對象:

summer = Bird()

通過這一句創(chuàng)建對象,并說明summer是屬于鳥類的一個對象
現(xiàn)在欠拾,我們就可以使用鳥類中已經(jīng)寫好的代碼了
作為對象的summer將擁有鳥類的屬性和方法
對屬性的引用是通過對象.屬性(object.attribute)的形式實現(xiàn)的
比如說:

print(summer.reproduction)   #打印'egg'

用上面的方式胰锌,我們得到summer所屬類的繁衍方式

此外,我們還可以調(diào)用方法藐窄,讓summer執(zhí)行鳥類允許的動作资昧,比如:

summer.chirp('jijiji')

在調(diào)用方法時,我們只傳遞了一個參數(shù)荆忍,也就是字符串'jijiji'
這正是方法與函數(shù)有所區(qū)別的地方格带,盡管在定義類的方法時
我們必須加上這個self參數(shù),但self只能用在類定義的內(nèi)部
所以在調(diào)用方法時不需要對self傳入數(shù)據(jù)刹枉,通過chirp()方法
我的summer就可以叫了

到現(xiàn)在為止叽唱,描述對象的數(shù)據(jù)都儲存于類的屬性中
類屬性描述了一個類的共性,比如微宝,鳥類都有羽毛
所有屬于該類的對象會共享這些屬性棺亭,比如說
summer是一個鳥類的對象,因此summer也有羽毛
當然蟋软,我們可以通過某個對象來引用某個類屬性

對于一個類下的全部個體來說镶摘,某些屬性可能存在個體差異

因此嗽桩,為了完整描述個體,除了共性的類屬性外
我們還需要說明個性的對象屬性凄敢,在類中碌冶,我們可以通過self來操作對象的屬性
現(xiàn)在我們拓展Bird類:

class Bird(object):
    def chirp(self,sound):
        print(sound)
    def set_color(self,color):
        self.color = color
summer = Bird()
summer.set_color('yellow')
print(summer.color)         #打印yellow

在方法set_color()中,我們通過self參數(shù)設(shè)定了對象的屬性color
和類屬性一樣贡未,我們只能通過對象.屬性的方式來操作對象屬性
由于對象屬性依賴于self种樱,我們必須在某個方法內(nèi)部才能操作類屬性
因此,對象屬性沒辦法像類屬性一樣俊卤,在類下方直接賦初值

但py還是提供了初始化對象屬性的方法
py定義了一系列特殊方法嫩挤,特殊方法又被稱為魔法方法(Magic Method)
特殊方法的方法名很特別,前后有兩個下劃線消恍,比如init()
add(),dict()等岂昭,程序員可以在類定義中設(shè)定特殊方法
py會以特定的方式來處理各個特殊方法,對于類的init()
py會在每次創(chuàng)建對象時自動調(diào)用狠怨,因此约啊,我們可以在init()
方法內(nèi)部來初始化對象屬性:

class Bird(object):
    def __init__(self,sound):
        self.sound = sound
        print('my sound is:',sound)
    def chirp(self):
        print(self.sound)
summer = Bird('ji')
summer.chirp()
my sound is: ji
ji

在上面的類定義中,我們通過 init()方法說明了這個類的初始化方式
每當對象建立時佣赖,比如創(chuàng)建summer對象時恰矩,init()方法就會被調(diào)用
它會設(shè)定這個對象的屬性,在后面的chirp()方法中憎蛤,就可以通過self調(diào)用這一對象屬性
除了設(shè)定對象屬性外外傅,我們還可以在init()中加入其他指令
這些指令會在創(chuàng)建對象時執(zhí)行,在調(diào)用類時俩檬,類后面可以跟一個參數(shù)列表
這里放入的數(shù)據(jù)將傳給init()的參數(shù)萎胰,通過init()方法
我們可以在創(chuàng)建對象時就初始化對象屬性

除了操作對象屬性外,self參數(shù)還有另一個功能
就是能讓我們在一個方法內(nèi)部調(diào)用同一類的其他方法棚辽,比如:

class Bird(object):
    def chirp(self,sound):
        print(sound)
    def chirp_repeat(self,sound,n):
        for i in range(n):
            self.chirp(sound)
summer = Bird()
summer.chirp_repeat('ji',10)    #重復打印'ji'10次    
ji
ji
ji
ji
ji
ji
ji
ji
ji
ji

在方法chirp_repeat()中技竟,我們通過self調(diào)用了類中的另一個方法chirp()

備注:

因markdown格式問題,以上正文中加粗的init(),add(),dict()
均為__init__(),__add__(),__dict__()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屈藐,一起剝皮案震驚了整個濱河市榔组,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌联逻,老刑警劉巖瓷患,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遣妥,居然都是意外死亡,警方通過查閱死者的電腦和手機攀细,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門箫踩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱态,“玉大人,你說我怎么就攤上這事境钟〗醯#” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵慨削,是天一觀的道長洞渔。 經(jīng)常有香客問我,道長缚态,這世上最難降的妖魔是什么磁椒? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮玫芦,結(jié)果婚禮上浆熔,老公的妹妹穿的比我還像新娘。我一直安慰自己桥帆,他們只是感情好医增,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著老虫,像睡著了一般叶骨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祈匙,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天忽刽,我揣著相機與錄音,去河邊找鬼菊卷。 笑死缔恳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的洁闰。 我是一名探鬼主播歉甚,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扑眉!你這毒婦竟也來了纸泄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腰素,失蹤者是張志新(化名)和其女友劉穎聘裁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弓千,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡衡便,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镣陕。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡谴餐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呆抑,到底是詐尸還是另有隱情岂嗓,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布鹊碍,位于F島的核電站厌殉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏侈咕。R本人自食惡果不足惜公罕,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乎完。 院中可真熱鬧熏兄,春花似錦、人聲如沸树姨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽揪。三九已至硝清,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間转晰,已是汗流浹背芦拿。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留查邢,地道東北人蔗崎。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像扰藕,于是被迫代替她去往敵國和親缓苛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355