python筆記:Class(類)

在學(xué)習(xí)python代碼中九巡,你是否看到過Class這個詞聚凹?你是否見過__init__這樣的代碼枉圃?有的書里把這部分內(nèi)容講的太過“專業(yè)”芜壁,導(dǎo)致我看了也看不懂礁凡。直到看Python Crash Course這本書關(guān)于這部分講解,才明白什么是Class慧妄。其實如果之前的function能理解的話顷牌,學(xué)習(xí)Class也不是非常難。這篇筆記就是記錄有關(guān)class的基礎(chǔ)結(jié)構(gòu)和基本的使用(更多內(nèi)容請閱讀該書第九章)

你可以使用“類”為任何東西建立模型塞淹。讓我們從編寫一個簡單的“類”開始窟蓝,這個類的名字叫Dog,它表示一條狗——不是特定的一條狗饱普,而是任意一條狗运挫。對大多數(shù)寵物狗他們都有名字和年齡。我們還知道套耕,大多數(shù)狗都會坐著和打滾滑臊。這兩條信息(name和age)和這兩種行為(sit和roll over)將在這個例子里,因為它們對大多數(shù)狗來說都很常見箍铲。這個類將告訴Python如何創(chuàng)建一個表示狗的對象。編寫完類之后鬓椭,我們將使用它來創(chuàng)建單獨的實例(instance)颠猴,每個實例代表一個特定的dog。

(一)創(chuàng)建一個class

從類創(chuàng)建的每個實例將存儲一個名稱name和一個年齡age小染,我們將給每只狗提供sit()和roll_over():

1)  class Dog:
2)      """A simple attempt to model a dog."""

3)     def __init__(self, name, age):
         """Initialize name and age attributes."""
4)         self.name = name
           self.age = age
        
5)     def sit(self):
          """Simulate a dog sitting in response to a command."""
          print(f"{self.name} is now sitting.")

       def roll_over(self):    
          """Simulate rolling over in response to a command."""
          print(f"{self.name} rolled over!")

在1)處翘瓮,我們定義了一個名為Dog的類。按照慣例裤翩,大寫的名稱在Python中指代類资盅。在類定義中沒有括號,因為我們是從頭創(chuàng)建這個類踊赠。在2)處呵扛,我們寫一個文檔字符串(docstring)來描述這個類做什么。

(1) __init__ ()方法

作為類的一部分的function就是方法(method)筐带。你學(xué)過的function知識也適用于方法今穿。目前唯一的實際區(qū)別是我們調(diào)用方法的方式。在3)處的__init__()方法是一個特殊的method伦籍,每當(dāng)我們基于Dog類創(chuàng)建一個新實例時蓝晒,Python都會自動運行該方法腮出。這個方法有兩個前導(dǎo)下劃線和兩個后置下劃線,這個慣例有助于防止Python的默認方法名與method名沖突芝薇。請確保在__init__()的兩邊都使用兩個下劃線胚嘲。我們定義__init__()方法有三個參數(shù):selfnameage洛二。self參數(shù)在方法定義中是必需的馋劈,而且它必須在其他參數(shù)之前出現(xiàn)。它必須包含在定義中灭红,因為當(dāng)Python在稍后調(diào)用該方法(創(chuàng)建Dog實例)時侣滩,將自動傳遞self參數(shù)。每個與實例關(guān)聯(lián)的方法調(diào)用都會自動傳遞self变擒。當(dāng)創(chuàng)建Dog的實例時君珠,Python將從Dog類調(diào)用__init__()方法。將name和age作為參數(shù)傳遞給Dog()娇斑,self會自動傳遞策添,所以我們不需要傳遞它。每當(dāng)我們想要從Dog類創(chuàng)建一個實例時毫缆,我們只需提供最后兩個參數(shù)的值唯竹,name和age。

在4)處定義的兩個變量都有前綴self苦丁。任何帶self前綴的變量都可以用于類中的每個方法浸颓,而且我們還能夠通過從類創(chuàng)建的任何實例訪問這些變量。self.name = name接受與參數(shù)名相關(guān)聯(lián)的值旺拉,并將其賦值給變量名产上,然后將變量名附加到正在創(chuàng)建的實例上。self.age = age也是一樣的蛾狗。可以通過這樣的實例訪問的變量稱為屬性(attributes)晋涣。

在5)處,這個Dog類還定義了另外兩個方法:sit()和roll_over() 沉桌。因為這些方法不需要額外的信息來運行谢鹊,所以我們定義它們只有一個參數(shù)self。我們稍后創(chuàng)建的實例能夠訪問這些方法留凭。目前佃扼,sit()和roll_over()只是打印信息。但是這個概念可以擴展到現(xiàn)實情況:如果這個類是一個真實的電腦游戲的一部分蔼夜,那么這些方法將包含讓動畫狗坐下和翻滾的代碼松嘶。

(二)從class里創(chuàng)建一個實例

可以將類看作是一組關(guān)于如何創(chuàng)建實例的指令。Dog類是一組指令挎扰,告訴Python如何創(chuàng)建代表特定狗的單個實例翠订。

讓我們用一個實例來代表一只特定的狗(實際上就是指定參數(shù)的值巢音,并且調(diào)用methods):

my_dog = Dog('Willie', 6)

print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")

我們在這里使用的Dog類是我們在上面剛剛編寫的類(class)。這里尽超,我們告訴python創(chuàng)建一只名叫“Willie”的6歲狗官撼。當(dāng)Python讀取這一行時,它調(diào)用Dog中的__init__()方法似谁,參數(shù)為'Willie'和6傲绣。__init__()方法創(chuàng)建一個表示這只特定狗的實例,并使用我們提供的值設(shè)置nameage屬性巩踏。然后Python返回一個表示這條狗的實例秃诵。我們將該實例賦值給變量my_dog。這里的命名的慣例很有幫助:我們通橙恚可以假設(shè)大寫的名字(如Dog)指的是一個類菠净,小寫的名字(如my_dog)指的是從一個類創(chuàng)建的單個實例。

運行后的結(jié)果:

My dog's name is Willie.
My dog is 6 years old.
(1)訪問attributes

如果你要訪問一個實例里的attributes彪杉,在上面的例子里就是nameage

my_dog.name

得到的結(jié)果是:

'Willie'

點符號在Python中經(jīng)常使用毅往。這個語法演示了Python如何查找屬性的值。在這里派近,Python查看my_dog實例攀唯,然后找到與my_dog相關(guān)聯(lián)的屬性名。這個屬性與Dog類中的self.name相同渴丸。

(2)調(diào)用methods

在創(chuàng)建了一個實例后侯嘀,我們可以使用點符號來調(diào)用Dog類里的任何methods:

my_dog.sit()
my_dog.roll_over()

要調(diào)用一個方法,請給出實例的名稱(在本例中為my_dog)和你想要調(diào)用的方法谱轨,并用點分隔戒幔。當(dāng)Python讀取my_dog.sit()時,它在Dog類中尋找sit()方法并運行該代碼碟嘴。Python以同樣的方式解釋my_dog.roll_over()行。

所以運行后的結(jié)果是:

Willie is now sitting.
Willie rolled over!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載囊卜,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者娜扇。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市栅组,隨后出現(xiàn)的幾起案子雀瓢,更是在濱河造成了極大的恐慌,老刑警劉巖玉掸,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刃麸,死亡現(xiàn)場離奇詭異,居然都是意外死亡司浪,警方通過查閱死者的電腦和手機泊业,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門把沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吁伺,你說我怎么就攤上這事饮睬。” “怎么了篮奄?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵捆愁,是天一觀的道長。 經(jīng)常有香客問我窟却,道長昼丑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任夸赫,我火速辦了婚禮菩帝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憔足。我一直安慰自己胁附,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布滓彰。 她就那樣靜靜地躺著控妻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揭绑。 梳的紋絲不亂的頭發(fā)上弓候,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音他匪,去河邊找鬼菇存。 笑死,一個胖子當(dāng)著我的面吹牛邦蜜,可吹牛的內(nèi)容都是我干的依鸥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼悼沈,長吁一口氣:“原來是場噩夢啊……” “哼贱迟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起絮供,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤衣吠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后壤靶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缚俏,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忧换。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恬惯。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖包雀,靈堂內(nèi)的尸體忽然破棺而出宿崭,到底是詐尸還是另有隱情,我是刑警寧澤才写,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布葡兑,位于F島的核電站,受9級特大地震影響赞草,放射性物質(zhì)發(fā)生泄漏讹堤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一厨疙、第九天 我趴在偏房一處隱蔽的房頂上張望洲守。 院中可真熱鬧,春花似錦沾凄、人聲如沸梗醇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叙谨。三九已至,卻和暖如春保屯,著一層夾襖步出監(jiān)牢的瞬間手负,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工姑尺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竟终,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓切蟋,卻偏偏與公主長得像统捶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柄粹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容