1.面向對象結構分析: ----面相對象總體大體分爲兩塊區域: --------第一部分:靜態字段(靜態變量)部分 --------第二部分:方法部分 --每一個大區域能夠分爲多個小部分: class A: cooname = 'Jake' # 靜態變量(靜態字段) __cooage = 20 # 私有靜態變量(私有靜態字段) def __init__(self, name, age): # 普通方法(構造方法) self.name = name # 對象屬性(普通字段) self.__age = age # 私有對象屬性(私有普通字段) def func1(self): # 普通方法 pass def __func(self): # 私有方法 pass @property def prop(self): # 屬性 pass @classmethod # 類方法 def class_func(cls): '''定義類方法,至少有一個cls參數''' pass @staticmethod # 靜態方法 def stact_func(): '''定義靜態方法,無默認參數''' pass 2.面向對象的私有與公有 對於每個類的成員而言都有兩種形式: ----共有成員,在任何地方均可以訪問 ----私有成員,只有在類的內部才能訪問 --------私有成員和共有成員的訪問限制不一樣: 靜態字段(靜態變量) --共有靜態字段:類能夠訪問,類內部能夠訪問,派生類中能夠訪問 --私有靜態字段:僅類內部能夠訪問 普通字段(對象屬性) --共有普通字段:對象能夠訪問,類內部能夠訪問,派生類中能夠訪問 --私有普通字段:僅類內部能夠訪問 方法: --共有方法:對象能夠訪問,類內部能夠訪問,派生類中能夠訪問 --私有方法:僅類內部能夠訪問 總結: 對於這些私有成員來講,他們只能在類的內部使用,不能在類的外部以及派生類中使用. ps:非要訪問私有成員的話,能夠經過 對象._類__屬性名,可是絕對不容許!!! 爲何能夠經過._類__私有成員名訪問呢?由於類在建立時, 若是遇到了私有成員(包括私有靜態字段,私有普通字段,私有方法) 它會將其保存在內存時自動在前面加上_類名. 3.面向對象的成員 1)字段 字段包括:普通字段和靜態字段,他們在定義和使用中有所區別, 而最本質的區別是內存中保存的位置不一樣, --普通字段屬於對象 --靜態字段屬於類
由上圖: 靜態字段在內存中只保存一份 普通字段在每一個對象中都要保存一份 應用場景: 經過類建立對象時,若是每一個對象都具備相同的字段,那麼就使用靜態字段 2)方法 方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬於類,區別在於調用方式不一樣。 --普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self; --類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類複製給cls; --靜態方法:由類調用;無默認參數;
如上圖: 相同點:對於全部的方法而言,均屬於類(非對象)中,因此,在內存中也只保存一份。 不一樣點:方法調用者不一樣、調用方法時自動傳入的參數不一樣。 4.property classmethod staticmethod 1)property #將一個方法,假裝成屬性 class Bmi(object): def __init__(self, name, weight, highe): self.name = name self.weight = weight self.height = highe @property def func(self): BMI = self.weight / (self.height ** 2) return BMI person = Bmi('Tom', 80, 1.73) s = person.name ss = person.func #將方法假裝成屬性 print('%s的BIM指數爲%s' % (s, ss)) -------------------------------------------------- class Person(): def __init__(self, name, age): self.name = name self.__age = age if type(age) is int else print('從新輸入') @property #執行查詢操做自動執行此操做 def age(self): return self.__age @age.setter #執行更改操做執行此操做 def age(self, temp): self.__age = temp if type(temp) is int else print('從新輸入') @age.deleter #執行del操做自動執行此方法 def age(self): del self.__age 2)classmethod ----類方法:經過類名調用方法,類方法中第一個參數約定俗稱cls,python自動將類名傳給cls class A: def func(self): # 普通方法 print(self) @classmethod def func0(cls): # 類方法 print(cls) a = A() a.func() # <__main__.A object at 0x105d8a438> A.func0() # <class '__main__.A'> a1 = A() a1.func0() # 對象調用類方法,cls 獲得的是類自己. ****¥類方法應用場景 1-類中一些方法不須要對象參與 2-對類中靜態變量進行改變 3-繼承中,父類獲得子類的類空間 例子: class A: age = 10 @classmethod def func(cls): print(cls.age) class B(A): age = 20 B.func() # 20 3)staticmethod 由類名調用,無默認參數,主要做用是:可以使代碼清晰,複用性強!