在學(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ù):self
、name
和age
洛二。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è)置name
和age
屬性巩踏。然后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彪杉,在上面的例子里就是name
和age
:
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!