封裝(Encapsulation)是對 object 的一種抽象,即将某些部分隐藏起來,在程式外部看不到,即無法調用(不是人用眼睛看不到那個代碼,除非用某種加密或者混淆方法,造成現實上的困難,但這不是封裝)。
要了解封裝,離不開“私有化”,就是将類或者函數中的某些屬性限制在某個區域之内,外部無法調用。
Python 中私有化的方法也比較簡單,就是在準備私有化的屬性(包括方法、資料)名字前面加雙下劃線。例如:
運作一下,看看效果:
檢視報錯資訊,告訴我們沒有__name 那個屬性。果然隐藏了,在類的外面無法調用。再試試那個函數,可否?
修改這部分即可。其中 p.code() 的意圖是要列印出兩句話:"Which language do you like?"和"I love Python.",code() 方法和__python() 方法在同一個類中,可以調用之。後面的那個 p.__Python() 試圖調用那個私有方法。看看效果:
如願以償。該調用的調用了,該隐藏的隐藏了。
用上面的方法,的确做到了封裝。但是,我如果要調用那些私有屬性,怎麼辦?
可以使用 property 函數。
運作結果:
從上面可以看出,用了 @property 之後,在調用那個方法的時候,用的是 p.name 的形式,就好像在調用一個屬性一樣,跟前面 p.me 的格式相同。