類和實(shí)例:
定義一個(gè)類:class后面緊接著是類名,即Student,類名通常是大寫(xiě)開(kāi)頭的單詞,緊接著是(object),表示該類是從哪個(gè)類繼承下來(lái)的,繼承的概念我們后面再講,通常,如果沒(méi)有合適的繼承類,就使用object類,這是所有類最終都會(huì)繼承的類。
實(shí)例化對(duì)象:定義好了Student類,就可以根據(jù)Student類創(chuàng)建出Student的實(shí)例,創(chuàng)建實(shí)例是通過(guò)類名+()實(shí)現(xiàn)的。
由于類可以起到模板的作用,因此,可以在創(chuàng)建實(shí)例的時(shí)候,把一些我們認(rèn)為必須綁定的屬性強(qiáng)制填寫(xiě)進(jìn)去。通過(guò)定義一個(gè)特殊的__init__方法,在創(chuàng)建實(shí)例的時(shí)候,就把name,score等屬性綁上去:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
注意到__init__方法的第一個(gè)參數(shù)永遠(yuǎn)是self,表示創(chuàng)建的實(shí)例本身,因此,在__init__方法內(nèi)部,就可以把各種屬性綁定到self,因?yàn)閟elf就指向創(chuàng)建的實(shí)例本身。
有了__init__方法,在創(chuàng)建實(shí)例的時(shí)候,就不能傳入空的參數(shù)了,必須傳入與__init__方法匹配的參數(shù),但self不需要傳,Python解釋器自己會(huì)把實(shí)例變量傳進(jìn)去。
和普通的函數(shù)相比,在類中定義的函數(shù)只有一點(diǎn)不同,就是第一個(gè)參數(shù)永遠(yuǎn)是實(shí)例變量self,并且,調(diào)用時(shí),不用傳遞該參數(shù)。除此之外,類的方法和普通函數(shù)沒(méi)有什么區(qū)別,所以,你仍然可以用默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)。
數(shù)據(jù)封裝:
內(nèi)部定義訪問(wèn)數(shù)據(jù)的函數(shù),這樣,就把“數(shù)據(jù)”給封裝起來(lái)了。這些封裝數(shù)據(jù)的函數(shù)是和Student類本身是關(guān)聯(lián)起來(lái)的,我們稱之為類的方法:在類的方法后面?zhèn)魅雲(yún)?shù)(self),可以訪問(wèn)類的屬性。
小結(jié)
類是創(chuàng)建實(shí)例的模板,而實(shí)例則是一個(gè)一個(gè)具體的對(duì)象,各個(gè)實(shí)例擁有的數(shù)據(jù)都互相獨(dú)立,互不影響;
方法就是與實(shí)例綁定的函數(shù),和普通函數(shù)不同,方法可以直接訪問(wèn)實(shí)例的數(shù)據(jù);
通過(guò)在實(shí)例上調(diào)用方法,我們就直接操作了對(duì)象內(nèi)部的數(shù)據(jù),但無(wú)需知道方法內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。
和靜態(tài)語(yǔ)言不同,Python允許對(duì)實(shí)例變量綁定任何數(shù)據(jù),也就是說(shuō),對(duì)于兩個(gè)實(shí)例變量,雖然它們都是同一個(gè)類的不同實(shí)例,但擁有的變量名稱都可能不同: