封裝函數
1.什麼是封裝:spa
封:屬性對外隱藏,但對內開放code
裝:申請一個名稱空間,往裏裝入一系列名字/屬性對象
2.爲何要封裝:blog
封裝數據屬性:不讓外部使用者直接使用數據,須要類內部開闢一個接口,讓外部經過接口使用數據,好處在於能夠在接口中定義各類規則接口
封裝函數屬性:定義函數就是爲了給類外部使用者的,隱藏函數屬性是爲了避免讓外部直接使用,需內部接口,而後接口去調用隱藏的功能it
封裝的精髓是隔離複雜度class
3.如何封裝(隱藏):在屬性前加上__開頭語法
①這種隱藏只是語法上的變形操做,類中__n實際上是_類名__n方法
②該變形只是在類定義階段發生一次
③這種隱藏是對外的,對內是開放的
④若是不想讓子類的方法覆蓋父類的,則可隱藏
特性:property
將一個類的函數定義成特性之後,對象再去使用的時候obj.name,根本沒法察覺本身的name是執行了一個函數而後計算出來的,這種特性的使用方式遵循了統一訪問的原則
封裝的三種方法:
class Foo: def __init__(self,val): self.__NAME=val #將全部的數據屬性都隱藏起來 @property # 查 def name(self): return self.__NAME #obj.name訪問的是self.__NAME(這也是真實值的存放位置) @name.setter # 改 def name(self,value): if not isinstance(value,str): #在設定值以前進行類型檢查 raise TypeError('%s must be str' %value) self.__NAME=value #經過類型檢查後,將值value存放到真實的位置self.__NAME @name.deleter # 刪 def name(self): raise TypeError('Can not delete') f=Foo('egon') print(f.name) # f.name=10 #拋出異常'TypeError: 10 must be str' del f.name #拋出異常'TypeError: Can not delete'
綁定方法
特性綁定給誰,就該誰來用,將第一個參數自動傳入
綁定方法分爲兩類:
①綁定給對象用:
在類內部定義的函數,默認都是綁定給對象使用的
②綁定給類使用:
若類中函數被@classmethod裝飾,就是綁定給類的,類調用,自動將類做爲第一個參數傳入
注:對象也可使用綁定給類的方法,可是自動傳入的仍是對象所屬的類
綁定方法的精髓:自動傳值
非綁定方法:被@staticmethod裝飾
既不與類綁定,又不與對象綁定,意味着沒有任何自動傳值的效果,是一個普通函數
應用:若函數體代碼須要用到類,則綁定給類
若函數體代碼須要用到對象的值,則綁定給對象
若函數體代碼既不須要用到對象的值也不須要用到類,則使用非綁定方法