天天看點

第7.11節 案例詳解:Python類執行個體變量

上節老猿介紹了執行個體變量的通路方法,本節結合一個具體案例詳細介紹執行個體變量通路。

本節定義一個vehicle類(車),它有三個執行個體變量self.wheelcount(輪子數)、self.power(動力)、self.totaldistance(累計行駛裡程),但在構造方法内隻定義了前2個,第3個在其他執行個體方法中通路。一、類定義

#drive方法中要根據一次行駛距離計算總行駛裡程,但self.totaldistance沒有在構造方法定義,是以在drive方法内采用了一個異常處理,確定該執行個體變量未定義時會執行定義,當然在構造函數内初始化定義該變量是最好的。   

#類似drive方法,在gettotaldistance内判斷執行個體是否有'totaldistance'存在,以便對一個未定義的執行個體變量進行初始化防止程式出錯

二、執行個體化對象及執行個體變量的通路

我們定義兩個執行個體對象馬車和汽車:

為了友善觀察對象的屬性,我們定義一個函數dirp取代dir,該函數是将dir傳回的帶兩個下劃線開頭的屬性和方法剔除,因為帶兩個下劃線的屬性和方法要麼是私有的(雙下劃線開頭,不是雙下劃線結尾),要麼是特殊變量(特殊變量必須以雙下劃線開頭和結尾),特殊變量是可以直接通路的,但因為從object類繼承過來的特殊屬性太多,不利于觀察自己定義屬性,是以剔除:

我們用dirp觀察hippomobile、car這2個對象的屬性和方法,他們都有:

['drive', 'gettotaldistance', 'power', 'wheelcount']

此時執行:

再用dirp觀察,會發現hippomobile保持不變,car多出了一個oil屬性,truck的屬性與hippomobile一樣,可見執行個體增加的屬性對存量對象和新定義的執行個體對象都不會影響,隻影響該執行個體自身。

我們再執行:truck.drive(100),再用dirp觀察,發現truck對象多了一個'totaldistance'屬性,而其他對象都沒有,可見這個屬性是執行方法後變量指派之後才存在,并不是執行個體定義之後就存在,如果要變量定義就存在,就需要在構造方法進行初始化。

通過上面案例的說明,執行個體屬性是必須執行指派語句之後才存在,該指派語句要麼就是執行個體方法中(不一定是構造方法)的代碼,要麼就是類體外面的通路執行個體的代碼。

本節老猿介紹了執行個體變量指派的方法,并給出了相關案例,内容比較重要但容易了解,請大家結合案例好好了解。