1. 程式人生 > 實用技巧 >python-類的隱藏和封裝

python-類的隱藏和封裝

7 """
  8 封裝是面對物件的三大特徵之一(另外兩個是整合和多型),它指的是將物件>    的資訊隱藏在物件的內部,不允許外部程式直接訪問物件內部資訊,而是通>    過該類鎖提供的方法來實現對內部資訊的操作和訪問
  9 封裝是面對物件程式語言對客觀世界的模擬。對一個類或者物件進行良好的>    封裝可以達到以下目的:
 10 1隱藏類的實現細節
 11 2讓使用者稚嫩溝通過實現預定的方法來訪問資料,從而可以在該方法中加>    入控制邏輯,限制對屬性的不合理訪問
 12 3可進行資料檢查,從而有利於保證物件資訊的完整性
 13 4便於修改,提高程式碼的可維護性
 14 5將兌現搞得屬性和實現細節隱藏起來,不允許外部直接訪問
 15 6把方法暴露出來,讓方法來控制對這些屬性進行安全的訪問和操作
 16  
 17 
""" 18 class user(object): 19 def __hide(self): 20 print('示範隱藏的hide方法') 21 def getname(self): 22 return self.__name 23 def setname(self,name): 24 if len(name) < 3: 25 raise Exception("不符合標準") 26 self.__name = name 27 """ 28 讀操作-getname()方法來實現 29 寫操作-setname()方法來實現 30
""" 31 name = property(getname,setname) 32 def setage(self,age): 33 self.__age = age 34 def getage(self): 35 return self.__age 36 """ 37 讀操作-getage()方法來實現 38 寫操作-setage()方法來實現 39 """ 40 age = property(getage,setage) 41 42 u = user() 43 """
44 u.name = 'ff' 45 這個程式試圖將name屬性賦值為ff,這個字串的長度為2不符合我們所設定 的賦值標準,則會丟擲錯誤 46 Traceback (most recent call last): 47 File "test_class_packkeage.py", line 43, in <module> 48 u.name = 'ff' 49 File "test_class_packkeage.py", line 25, in setname 50 raise Exception("不符合標準") 51 Exception: 不符合標準 52 """ 53 u.name = 'fff'#符合設定的標準 54 """ 55 u.__hide() 56 __hide()方法是隱藏的,如果支架呼叫則會報錯 57 Traceback (most recent call last): 58 File "test_class_packkeage.py", line 54, in <module> 59 u.__hide() 60 AttributeError: 'user' object has no attribute '__hide' 61 python其實沒有真正的隱藏機制,雙下劃線只是python的一個小技巧,pytho n會偷偷的改變以雙下劃線開頭的屬性名或者方法名,會在這些屬性名和方法 名前面新增_user__hide() 62 """ 63 u._user__hide() 64 #示範隱藏的hide方法 65 #對隱藏的屬性進行賦值 66 u._user__name = "dd" 67 #通過這種方式可以繞過我們所設定的檢查機制不會丟擲錯誤 68

總結:python並沒有提供真正的隱藏機制,如果程式希望隱藏類中的某些屬性或者方法,那麼只要在該成員的前面加上__.不過我們要知道的是,即使通過這種機制實現了隱藏,我們也可以繞過這些隱藏來呼叫這些成員