官术网_书友最值得收藏!

3.6 面向?qū)ο蠡A(chǔ)

20世紀(jì)60年代,人們首次提出面向?qū)ο螅∣bject Oriented,OO)的概念,發(fā)展至今已成為一種成熟的編程思想,并逐步成為軟件開(kāi)發(fā)領(lǐng)域的主流技術(shù)。面向?qū)ο缶幊蹋∣bject Oriented Programming,OOP)主要針對(duì)大型軟件開(kāi)發(fā),可以使軟件設(shè)計(jì)更加靈活,并且能更好地進(jìn)行代碼復(fù)用。

面向?qū)ο笾械膶?duì)象(Object)通常是指客觀世界中存在的對(duì)象,具有唯一性,對(duì)象之間各不相同,各有各的特點(diǎn),每一個(gè)對(duì)象都有自己的運(yùn)動(dòng)規(guī)律和內(nèi)部狀態(tài);對(duì)象與對(duì)象之間可以相互聯(lián)系,相互作用。另外,對(duì)象也可以是一個(gè)抽象的事物,例如,可以從圓形、正方形、三角形等圖形抽象出一個(gè)簡(jiǎn)單圖形,簡(jiǎn)單圖形就是一個(gè)對(duì)象,它有自己的屬性和行為,圖形中邊的個(gè)數(shù)是它的屬性,圖形的面積也是它的屬性,輸出圖形的面積就是它的行為。概括地講,面向?qū)ο蠹夹g(shù)是一種從組織結(jié)構(gòu)上模擬客觀世界的方法。

3.6.1 面向?qū)ο蟾攀?/h4>

1.對(duì)象

世間萬(wàn)物皆對(duì)象,現(xiàn)實(shí)世界中的任意一個(gè)事物都是對(duì)象。對(duì)象是事物存在的實(shí)體,如一個(gè)人,如圖3.56所示。

通常將對(duì)象劃分為兩個(gè)部分,即靜態(tài)部分與動(dòng)態(tài)部分。靜態(tài)部分被稱(chēng)為“屬性”,任何對(duì)象都具備自身屬性,這些屬性不僅是客觀存在的,而且是不能被忽視的,如人的性別,如圖3.57所示;動(dòng)態(tài)部分指的是對(duì)象的行為,即對(duì)象可執(zhí)行的動(dòng)作,如人可以跑步,如圖3.58所示。

圖3.56 對(duì)象“人”的示意圖

圖3.57 靜態(tài)屬性“性別”示意圖

圖3.58 動(dòng)態(tài)屬性“跑步”示意圖

說(shuō)明

Python中一切皆為對(duì)象,不僅具體的事物是對(duì)象,字符串、函數(shù)等也都是對(duì)象。這說(shuō)明Python天生就是為面向?qū)ο蠖_(kāi)發(fā)出來(lái)的程序語(yǔ)言。

2.類(lèi)

類(lèi)是封裝對(duì)象的屬性和行為的載體,反過(guò)來(lái)說(shuō)具有相同屬性和行為的一類(lèi)實(shí)體被稱(chēng)為類(lèi)。例如,把雁群比作大雁類(lèi),那么大雁類(lèi)就具備了喙、翅膀和爪等屬性,覓食、飛行和睡覺(jué)等行為,而一只要從北方飛往南方的大雁則被視為大雁類(lèi)的一個(gè)對(duì)象。大雁類(lèi)和大雁對(duì)象的關(guān)系如圖3.59所示。

圖3.59 大雁類(lèi)和大雁對(duì)象的關(guān)系圖

在Python語(yǔ)言中,類(lèi)是一種抽象概念。如定義一個(gè)大雁類(lèi)(Geese),在該類(lèi)中可以定義每個(gè)對(duì)象共有的屬性和方法;而一只要從北方飛往南方的大雁則是大雁類(lèi)的一個(gè)對(duì)象(wildGeese),對(duì)象是類(lèi)的實(shí)例。有關(guān)類(lèi)的具體實(shí)現(xiàn)將在3.6.2節(jié)中詳細(xì)介紹。

3.面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)

面向?qū)ο蟪绦蛟O(shè)計(jì)具有三大基本特征:封裝、繼承和多態(tài)。

1)封裝

封裝是面向?qū)ο缶幊痰暮诵乃枷耄瑢?duì)象的屬性和行為封裝起來(lái),其載體就是類(lèi)。類(lèi)通常會(huì)對(duì)客戶(hù)隱藏其實(shí)現(xiàn)細(xì)節(jié),這就是封裝的思想。例如,用戶(hù)使用計(jì)算機(jī)時(shí),只需要使用手指敲擊鍵盤(pán)就可以實(shí)現(xiàn)一些功能,并不需要知道計(jì)算機(jī)內(nèi)部是如何工作的。

采用封裝思想可保證類(lèi)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的完整性,使用該類(lèi)的用戶(hù)不能直接看到類(lèi)中的數(shù)據(jù)結(jié)構(gòu),而只能執(zhí)行類(lèi)允許公開(kāi)的數(shù)據(jù),這樣就避免了外部對(duì)內(nèi)部數(shù)據(jù)的影響,提高了程序的可維護(hù)性。

使用類(lèi)實(shí)現(xiàn)封裝特性如圖3.60所示。

圖3.60 封裝特性示意圖

2)繼承

矩形、菱形、平行四邊形和梯形都是四邊形,它們具有共同的特征—擁有4條邊。

只要將四邊形適當(dāng)?shù)匮由欤蜁?huì)得到矩形、菱形、平行四邊形和梯形4種圖形。以平行四邊形為例,如果把平行四邊形看作四邊形的延伸,那么平行四邊形就復(fù)用了四邊形的屬性和行為,同時(shí)添加了平行四邊形特有的屬性和行為,如平行四邊形的對(duì)邊平行且相等的特性。在Python中,可以把平行四邊形類(lèi)看作是繼承四邊形類(lèi)后產(chǎn)生的類(lèi),其中,四邊形類(lèi)稱(chēng)為父類(lèi)或超類(lèi),平行四邊形類(lèi)稱(chēng)為子類(lèi)。值得注意的是,可以說(shuō)平行四邊形是特殊的四邊形,但不能說(shuō)四邊形是平行四邊形。同理,Python中可以說(shuō)子類(lèi)的實(shí)例都是父類(lèi)的實(shí)例,但不能說(shuō)父類(lèi)的實(shí)例是子類(lèi)的實(shí)例。四邊形類(lèi)層次結(jié)構(gòu)示意圖如圖3.61所示。

綜上所述,繼承是實(shí)現(xiàn)重復(fù)利用的重要手段,子類(lèi)通過(guò)繼承復(fù)用了父類(lèi)的屬性和行為,同時(shí)又添加了子類(lèi)特有的屬性和行為。

3)多態(tài)

各個(gè)子類(lèi)在繼承父類(lèi)特征的基礎(chǔ)上,增加自己獨(dú)有的新特征,將各自區(qū)別開(kāi)來(lái)的狀態(tài),就稱(chēng)為多態(tài)。比如創(chuàng)建一個(gè)螺絲類(lèi),螺絲類(lèi)有兩個(gè)屬性:粗細(xì)和螺紋密度;然后再創(chuàng)建了兩個(gè)類(lèi),一個(gè)是長(zhǎng)螺絲類(lèi),一個(gè)是短螺絲類(lèi),并且它們都繼承了螺絲類(lèi)。這樣長(zhǎng)螺絲類(lèi)和短螺絲類(lèi)不僅具有相同的特征(粗細(xì)相同,且螺紋密度也相同),還具有不同的特征(一個(gè)長(zhǎng),一個(gè)短,長(zhǎng)的可以用來(lái)固定大型支架,短的可以固定生活中的家具)。綜上所述,一個(gè)螺絲類(lèi)衍生出不同的子類(lèi),子類(lèi)繼承父類(lèi)特征的同時(shí)也具備了自己的特征,并且能夠?qū)崿F(xiàn)不同的效果,這就是多態(tài)。螺絲類(lèi)層次結(jié)構(gòu)示意圖如圖3.62所示。

圖3.61 四邊形類(lèi)層次結(jié)構(gòu)示意圖

圖3.62 螺絲類(lèi)層次結(jié)構(gòu)示意圖

3.6.2 類(lèi)的定義和使用

在Python中,類(lèi)表示具有相同屬性和方法的對(duì)象的集合。在使用類(lèi)時(shí),需要先定義類(lèi),然后再創(chuàng)建類(lèi)的實(shí)例,通過(guò)類(lèi)的實(shí)例就可以訪(fǎng)問(wèn)類(lèi)中的屬性和方法。

1.定義類(lèi)

Python中,類(lèi)的定義使用class關(guān)鍵字來(lái)實(shí)現(xiàn),語(yǔ)法如下:

class ClassName:
'''類(lèi)的幫助信息'''         #類(lèi)文檔字符串
    statement              #類(lèi)體

參數(shù)說(shuō)明:

 ClassName:用于指定類(lèi)名,一般使用大寫(xiě)字母開(kāi)頭。如果類(lèi)名中包括兩個(gè)單詞,第二個(gè)單詞的首字母也大寫(xiě),這種命名方法也稱(chēng)為“駝峰式命名法”。當(dāng)然,也可根據(jù)自己的習(xí)慣命名,但是一般推薦按照慣例來(lái)命名。

 '''類(lèi)的幫助信息''':用于指定類(lèi)的文檔字符串,定義該字符串后,在創(chuàng)建類(lèi)的對(duì)象時(shí),輸入類(lèi)名和左側(cè)的括號(hào)“(”后,將顯示該信息。

 statement:類(lèi)體,主要由類(lèi)變量(或類(lèi)成員)、方法和屬性等定義語(yǔ)句組成。如果在定義類(lèi)時(shí),沒(méi)想好類(lèi)的具體功能,也可以在類(lèi)體中直接使用pass語(yǔ)句代替。

例如,下面以大雁為例聲明一個(gè)類(lèi),代碼如下:

class Geese:
'''大雁類(lèi)'''
    pass
2.創(chuàng)建類(lèi)的實(shí)例

定義完類(lèi)后,并不會(huì)真正創(chuàng)建一個(gè)實(shí)例。類(lèi)的定義有點(diǎn)像汽車(chē)的設(shè)計(jì)圖紙,可以告訴你汽車(chē)長(zhǎng)什么樣,但它本身并不是一個(gè)汽車(chē),你不能駕駛它,卻可以用它來(lái)建造真正的汽車(chē),而且可以用來(lái)制造很多汽車(chē)。

如何創(chuàng)建實(shí)例呢?class語(yǔ)句本身并不創(chuàng)建該類(lèi)的任何實(shí)例。所以在類(lèi)定義完成以后,可以創(chuàng)建類(lèi)的實(shí)例,即實(shí)例化該類(lèi)的對(duì)象。創(chuàng)建類(lèi)的實(shí)例的語(yǔ)法如下:

ClassName(parameterlist)

其中,ClassName是必選參數(shù),用于指定具體的類(lèi);parameterlist是可選參數(shù),當(dāng)創(chuàng)建一個(gè)類(lèi)時(shí),沒(méi)有創(chuàng)建__init__()方法,或者_(dá)_init__()方法只有一個(gè)self參數(shù)時(shí),parameterlist可以省略。

例如,創(chuàng)建上文定義的Geese類(lèi)的實(shí)例,可以使用下面的代碼:

wildGoose = Geese()         #創(chuàng)建大雁類(lèi)的實(shí)例
print(wildGoose)

執(zhí)行上面的代碼,將顯示類(lèi)似下面的內(nèi)容:

<__main__.Geese object at 0x0000000002F47AC8>

從上面的執(zhí)行結(jié)果中可以看出,wildGoose是Geese類(lèi)的實(shí)例。

3.創(chuàng)建__init__()方法

創(chuàng)建完一個(gè)類(lèi)后,需要為其創(chuàng)建__init__()方法。該方法類(lèi)似于Java語(yǔ)言中的構(gòu)造方法,每當(dāng)創(chuàng)建類(lèi)的新實(shí)例時(shí),Python都會(huì)自動(dòng)執(zhí)行它。__init__()方法必須包含一個(gè)self參數(shù),并且必須是第1個(gè)參數(shù)。self參數(shù)是一個(gè)指向?qū)嵗旧淼囊茫糜谠L(fǎng)問(wèn)類(lèi)中的屬性和方法。在方法調(diào)用時(shí)會(huì)自動(dòng)傳遞實(shí)際參數(shù)self,因此當(dāng)__init__()方法只有一個(gè)參數(shù)時(shí),創(chuàng)建類(lèi)的實(shí)例時(shí)將不再需要指定實(shí)際參數(shù)。

說(shuō)明

在__init__()方法的名稱(chēng)中,開(kāi)頭和結(jié)尾處是兩個(gè)下畫(huà)線(xiàn)(中間沒(méi)有空格),這是一種約定,旨在區(qū)分Python的默認(rèn)方法和普通的方法。

下面仍然以大雁為例,聲明一個(gè)Geese類(lèi),并且創(chuàng)建__init__()方法,代碼如下:

運(yùn)行上面的代碼,將輸出以下內(nèi)容:

我是大雁類(lèi)!

從運(yùn)行結(jié)果可以看出,創(chuàng)建大雁類(lèi)實(shí)例時(shí)雖然沒(méi)有為_(kāi)_init__()方法指定參數(shù),該方法仍會(huì)自動(dòng)執(zhí)行。

在__init__()方法中,除self參數(shù)外,還可以自定義一些參數(shù),參數(shù)間使用逗號(hào)“,”進(jìn)行分隔。例如,下面的代碼將在創(chuàng)建__init__()方法時(shí)再指定3個(gè)參數(shù),分別是beak、wing和claw。

執(zhí)行上面的代碼,將顯示如圖3.63所示的運(yùn)行結(jié)果。

圖3.63 創(chuàng)建__init__()方法時(shí)指定4個(gè)參數(shù)

4.創(chuàng)建類(lèi)的成員并訪(fǎng)問(wèn)

類(lèi)的成員主要由實(shí)例方法和數(shù)據(jù)成員組成。在類(lèi)中創(chuàng)建了類(lèi)成員后,可以通過(guò)類(lèi)的實(shí)例進(jìn)行訪(fǎng)問(wèn)。

1)創(chuàng)建實(shí)例方法并訪(fǎng)問(wèn)

所謂實(shí)例方法,就是在類(lèi)中定義的函數(shù),該函數(shù)需要在類(lèi)的實(shí)例上操作。同__init__()方法一樣,實(shí)例方法的第1個(gè)參數(shù)必須是self,并且必須包含一個(gè)self參數(shù)。創(chuàng)建實(shí)例方法的語(yǔ)法格式如下:

def functionName(self,parameterlist):
    block

參數(shù)說(shuō)明:

 functionName:用于指定方法名,一般使用小寫(xiě)字母開(kāi)頭。

 self:必要參數(shù),表示類(lèi)的實(shí)例,其名稱(chēng)可以是self以外的單詞。

 parameterlist:用于指定除self參數(shù)外的參數(shù),各參數(shù)間使用逗號(hào)“,”進(jìn)行分隔。

 block:方法體,表示要實(shí)現(xiàn)的具體功能。

說(shuō)明

實(shí)例方法和Python中函數(shù)的主要區(qū)別就是:函數(shù)實(shí)現(xiàn)的是某個(gè)獨(dú)立的功能,而實(shí)例方法用于實(shí)現(xiàn)類(lèi)中的某個(gè)行為,是類(lèi)的一部分。

實(shí)例方法創(chuàng)建完成后,可以通過(guò)類(lèi)的實(shí)例名稱(chēng)和點(diǎn)操作符(.)進(jìn)行訪(fǎng)問(wèn),語(yǔ)法格式如下:

instanceName.functionName(parametervalue)

參數(shù)說(shuō)明:

 instanceName:類(lèi)的實(shí)例名稱(chēng)。

 functionName:要調(diào)用的方法名稱(chēng)。

 parametervalue:對(duì)應(yīng)的實(shí)際參數(shù),其數(shù)量比parameterlist的個(gè)數(shù)少1。

【實(shí)例3.19】 創(chuàng)建大雁類(lèi)并定義飛行方法。(實(shí)例位置:資源包\Code\03\19)

具體代碼如下:

運(yùn)行結(jié)果如圖3.64所示。

圖3.64 創(chuàng)建大雁類(lèi)并定義飛行方法

多學(xué)兩招

在創(chuàng)建實(shí)例方法時(shí),也可以像創(chuàng)建函數(shù)一樣為參數(shù)設(shè)置默認(rèn)值。但是被設(shè)置了默認(rèn)值的參數(shù)必須位于所有參數(shù)的最后面(即最右側(cè))。例如,可以將實(shí)例3.19的第8行代碼修改為以下內(nèi)容:

    def fly(self, state = "我會(huì)飛行"):

此時(shí)再調(diào)用該方法,就可以不再指定參數(shù)值,第15行代碼可修改為“wildGoose.fly()”。

2)創(chuàng)建數(shù)據(jù)成員并訪(fǎng)問(wèn)

數(shù)據(jù)成員是指在類(lèi)中定義的變量,即屬性。根據(jù)定義位置,又可以分為類(lèi)屬性和實(shí)例屬性。

 類(lèi)屬性:定義在類(lèi)中,并且在函數(shù)體外的屬性。類(lèi)屬性可以在類(lèi)的所有實(shí)例之間共享值,也就是在所有實(shí)例化的對(duì)象中公用。類(lèi)屬性可以通過(guò)類(lèi)名或者實(shí)例名進(jìn)行訪(fǎng)問(wèn)。

例如,定義一個(gè)大雁類(lèi)Geese,在該類(lèi)中定義3個(gè)類(lèi)屬性,用于記錄雁類(lèi)的特征,代碼如下:

創(chuàng)建上面的類(lèi)Geese,然后創(chuàng)建該類(lèi)的實(shí)例,代碼如下:

geese = Geese()         #實(shí)例化一個(gè)雁類(lèi)的對(duì)象

應(yīng)用上面的代碼創(chuàng)建完Geese類(lèi)的實(shí)例后,將顯示以下內(nèi)容:

我屬于雁類(lèi)!我有以下特征:
脖子較長(zhǎng)
振翅頻率高
腿位于身體的中心支點(diǎn),行走自如

下面通過(guò)一個(gè)具體的實(shí)例演示類(lèi)屬性在類(lèi)的所有實(shí)例之間共享值的應(yīng)用。

【實(shí)例3.20】 創(chuàng)建大雁類(lèi)并共享類(lèi)屬性。(實(shí)例位置:資源包\Code\03\20)

定義一個(gè)大雁類(lèi)Geese,并在該類(lèi)中定義4個(gè)類(lèi)屬性,前3個(gè)用于記錄大雁類(lèi)的特征,第4個(gè)用于記錄實(shí)例編號(hào),然后定義一個(gè)構(gòu)造方法,在該構(gòu)造方法中將記錄實(shí)例編號(hào)的類(lèi)屬性進(jìn)行加1操作,并輸出4個(gè)類(lèi)屬性的值,最后通過(guò)for循環(huán)創(chuàng)建4個(gè)大雁類(lèi)的實(shí)例,代碼如下:

運(yùn)行結(jié)果如圖3.65所示。

圖3.65 通過(guò)類(lèi)屬性統(tǒng)計(jì)類(lèi)的實(shí)例個(gè)數(shù)

Python中除了可以通過(guò)類(lèi)名稱(chēng)訪(fǎng)問(wèn)類(lèi)屬性,還可以動(dòng)態(tài)地為類(lèi)和對(duì)象添加屬性。例如,在實(shí)例3.20的基礎(chǔ)上為雁類(lèi)添加一個(gè)beak屬性,并通過(guò)類(lèi)的實(shí)例訪(fǎng)問(wèn)該屬性,可以在上面代碼的后面再添加以下代碼:

01  Geese.beak = "喙的基部較高,長(zhǎng)度和頭部的長(zhǎng)度幾乎相等"  #添加類(lèi)屬性
02  print("第2只大雁的喙:",list1[1].beak)                 #訪(fǎng)問(wèn)類(lèi)屬性

說(shuō)明

上面的代碼只是以第2只大雁為例進(jìn)行演示,讀者也可以換成其他的大雁試試。運(yùn)行后,將在原來(lái)的結(jié)果后面再顯示以下內(nèi)容:

第2只大雁的喙:喙的基部較高,長(zhǎng)度和頭部的長(zhǎng)度幾乎相等

除了可以動(dòng)態(tài)地為類(lèi)和對(duì)象添加屬性外,也可以修改類(lèi)屬性,修改結(jié)果將作用于該類(lèi)的所有實(shí)例。

 實(shí)例屬性:指定義在類(lèi)的方法中的屬性,只作用于當(dāng)前實(shí)例。

例如,定義一個(gè)雁類(lèi)Geese,在該類(lèi)的__init__()方法中定義3個(gè)實(shí)例屬性,用于記錄雁類(lèi)的特征,代碼如下:

創(chuàng)建上面的類(lèi)Geese,然后創(chuàng)建該類(lèi)的實(shí)例,代碼如下:

geese = Geese()          #實(shí)例化一個(gè)雁類(lèi)的對(duì)象

應(yīng)用上面的代碼創(chuàng)建Geese類(lèi)的實(shí)例后,將顯示以下內(nèi)容:

我屬于雁類(lèi)!我有以下特征:
脖子較長(zhǎng)
振翅頻率高
腿位于身體的中心支點(diǎn),行走自如

對(duì)于實(shí)例屬性也可以通過(guò)實(shí)例名稱(chēng)修改,與類(lèi)屬性不同,通過(guò)實(shí)例名稱(chēng)修改實(shí)例屬性后,并不影響該類(lèi)的另一個(gè)實(shí)例中相應(yīng)的實(shí)例屬性的值。例如,定義一個(gè)雁類(lèi),并在__init__()方法中定義一個(gè)實(shí)例屬性,然后創(chuàng)建兩個(gè)Geese類(lèi)的實(shí)例,并且修改第一個(gè)實(shí)例的實(shí)例屬性,最后分別輸出這兩個(gè)實(shí)例的實(shí)例屬性,代碼如下:

運(yùn)行上面的代碼,將顯示以下內(nèi)容:

脖子較長(zhǎng)
脖子較長(zhǎng)
goose1的neck屬性: 脖子沒(méi)有天鵝的長(zhǎng)
goose2的neck屬性: 脖子較長(zhǎng)
5.訪(fǎng)問(wèn)限制

在類(lèi)內(nèi)定義的屬性和方法,在類(lèi)外可以直接調(diào)用,從而隱藏類(lèi)內(nèi)部的復(fù)雜邏輯。Python并沒(méi)有對(duì)屬性和方法的訪(fǎng)問(wèn)權(quán)限進(jìn)行限制。為了保證類(lèi)內(nèi)部的某些屬性或方法不被外部所訪(fǎng)問(wèn),可以在屬性或方法名前面添加單下畫(huà)線(xiàn)(_foo)、雙下畫(huà)線(xiàn)(__foo)或首尾加雙下畫(huà)線(xiàn)(__foo__),從而限制訪(fǎng)問(wèn)權(quán)限。

 首尾雙下畫(huà)線(xiàn)表示定義特殊方法,一般是系統(tǒng)定義名字,如__init__()。

 以單下畫(huà)線(xiàn)開(kāi)頭的表示protected(保護(hù))類(lèi)型的成員,只允許類(lèi)本身和子類(lèi)進(jìn)行訪(fǎng)問(wèn),但不能使用“from module import *”語(yǔ)句導(dǎo)入。

例如,創(chuàng)建一個(gè)Swan類(lèi),定義保護(hù)屬性_neck_swan,并使用__init__()方法訪(fǎng)問(wèn)該屬性,然后創(chuàng)建Swan類(lèi)的實(shí)例,并通過(guò)實(shí)例名輸出保護(hù)屬性_neck_swan,代碼如下:

執(zhí)行上面的代碼,將顯示以下內(nèi)容:

__init__(): 天鵝的脖子很長(zhǎng)
直接訪(fǎng)問(wèn): 天鵝的脖子很長(zhǎng)

從上面的運(yùn)行結(jié)果可以看出,保護(hù)屬性可以通過(guò)實(shí)例名訪(fǎng)問(wèn)。

 雙下畫(huà)線(xiàn)表示private(私有)類(lèi)型的成員,只允許定義該方法的類(lèi)本身進(jìn)行訪(fǎng)問(wèn),而且也不能通過(guò)類(lèi)的實(shí)例進(jìn)行訪(fǎng)問(wèn),但是可以通過(guò)“類(lèi)的實(shí)例名._類(lèi)名__xxx”方式訪(fǎng)問(wèn)。

例如,創(chuàng)建一個(gè)Swan類(lèi),定義私有屬性__neck_swan,并使用__init__()方法訪(fǎng)問(wèn)該屬性,然后創(chuàng)建Swan類(lèi)的實(shí)例,并通過(guò)實(shí)例名輸出私有屬性__neck_swan,代碼如下:

執(zhí)行上面的代碼后,將輸出如圖3.66所示的結(jié)果。

圖3.66 訪(fǎng)問(wèn)私有屬性

從上面的運(yùn)行結(jié)果可以看出,私有屬性不能直接通過(guò)實(shí)例名+屬性名訪(fǎng)問(wèn),可以在類(lèi)的實(shí)例方法中訪(fǎng)問(wèn),也可以通過(guò)“實(shí)例名._類(lèi)名__xxx”的方式訪(fǎng)問(wèn)。

主站蜘蛛池模板: 普宁市| 樟树市| 本溪| 金溪县| 家居| 青神县| 邹平县| 长宁区| 西青区| 武义县| 辽宁省| 留坝县| 侯马市| 昭苏县| 临朐县| 泾源县| 博兴县| 洛扎县| 三江| 安图县| 揭西县| 蒙山县| 鄂伦春自治旗| 平昌县| 清苑县| 米易县| 称多县| 浏阳市| 永川市| 肃北| 黑河市| 临江市| 星子县| 涪陵区| 桦甸市| 托克托县| 正镶白旗| 包头市| 清水县| 桐柏县| 铜山县|