以前我們講過類大體分兩塊區域,靜態字段部分和方法部分。python
每一個區域詳細劃分又能夠分爲:程序員
class A: company = '阿里巴巴' # 靜態變量(靜態字段) __tel = '400xxxxx' # 私有靜態變量(私有靜態字段) def __init__(self,name,age): #特殊方法(初始化方法) self.name = name # 對象屬性(普通字段) self.__age = age # 私有對象屬性(私有普通字段) def func1(self): # 普通方法 pass def __func(self): #私有方法 print(666) @classmethod # 類方法 def class_func(cls): """ 定義類方法,至少有一個cls參數 """ print('類方法') @staticmethod #靜態方法 def static_func(): """ 定義靜態方法 ,無默認參數""" print('靜態方法') @property # 屬性 def prop(self): pass
對於每個類的成員而言都有兩種形式:spa
公有成員,在任何地方都能訪問code
私有成員,只有在類的內部才能方法對象
私有成員和公有成員的訪問限制不一樣blog
靜態屬性內存
對象屬性開發
靜態字段(靜態屬性)源碼
公有靜態字段:類能夠訪問;類內部能夠訪問;派生類中能夠訪問it
私有靜態字段:僅類內部能夠訪問;
公有靜態屬性(字段)
class C: name = "公有靜態字段" def func(self): print C.name class D(C): def show(self): print C.name C.name # 類訪問 obj = C() obj.func() # 類內部能夠訪問 obj_son = D() obj_son.show() # 派生類中能夠訪問
私有靜態屬性(字段)
class C: __name = "私有靜態字段" def func(self): print C.__name class D(C): def show(self): print C.__name C.__name # 不可在外部訪問 obj = C() obj.__name # 不可在外部訪問 obj.func() # 類內部能夠訪問 obj_son = D() obj_son.show() #不可在派生類中能夠訪問
公有對象屬性
class C: def __init__(self): self.foo = "公有字段" def func(self): print self.foo # 類內部訪問 class D(C): def show(self): print self.foo # 派生類中訪問 obj = C() obj.foo # 經過對象訪問 obj.func() # 類內部訪問 obj_son = D(); obj_son.show() # 派生類中訪問
私有對象屬性
class C: def __init__(self): self.__foo = "私有字段" def func(self): print self.foo # 類內部訪問 class D(C): def show(self): print self.foo # 派生類中訪問 obj = C() obj.__foo # 經過對象訪問 ==> 錯誤 obj.func() # 類內部訪問 ==> 正確 obj_son = D(); obj_son.show() # 派生類中訪問 ==> 錯誤
公有方法:對象能夠訪問;類內部能夠訪問;派生類中能夠訪問
私有方法:僅類內部能夠訪問;
(1)公有方法
class C: def __init__(self): pass def add(self): print('in C') class D(C): def show(self): print('in D') def func(self): self.show() obj = D() obj.show() # 經過對象訪問 obj.func() # 類內部訪問 obj.add() # 派生類中訪問
(2)私有方法
class C: def __init__(self): pass def __add(self): print('in C') class D(C): def __show(self): print('in D') def func(self): self.__show() obj = D() obj.__show() # 經過不能對象訪問 obj.func() # 類內部能夠訪問 obj.__add() # 派生類中不能訪問
總結:對於這些私有成員來講,他們只能在類的內部使用,不能再類的外部以及派生類中使用.
非要訪問私有成員的話,能夠經過 對象._類__屬性名,可是絕對不容許!!!爲何能夠經過._類__私有成員名訪問呢?由於類在建立時,若是遇到了私有成員(包括私有靜態字段,私有普通字段,私有方法)它會將其保存在內存時自動在前面加上_類名.
這裏的其餘成員主要就是類方法:
方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬於類,區別在於調用方式不一樣。
實例方法
定義:第一個參數必須是實例對象,該參數名通常約定爲「self」,經過它來傳遞實例的屬性和方法(也能夠傳類的屬性和方法);
調用:只能由實例對象調用。
類方法
定義:使用裝飾器@classmethod。第一個參數必須是當前類對象,該參數名通常約定爲「cls」,經過它來傳遞類的屬性和方法(不能傳實例的屬性和方法);
調用:實例對象和類對象均可以調用。
靜態方法
定義:使用裝飾器@staticmethod。參數隨意,沒有「self」和「cls」參數,可是方法體中不能使用類或實例的任何屬性和方法;
調用:實例對象和類對象均可以調用。
雙下方法(後面會講到)
定義:雙下方法是特殊方法,他是解釋器提供的 由爽下劃線加方法名加爽下劃線 __方法名__的具備特殊意義的方法,雙下方法主要是python源碼程序員使用的,
咱們在開發中儘可能不要使用雙下方法,可是深刻研究雙下方法,更有益於咱們閱讀源碼。
調用:不一樣的雙下方法有不一樣的觸發方式,就比如盜墓時觸發的機關同樣,不知不覺就觸發了雙下方法,例如:__init__