Python面向物件 | 類的成員
一. 細分類的組成成員
之前咱們講過類大致分兩塊區域,靜態欄位部分和方法部分。
每個區域詳細劃分又可以分為:
class A: company = '阿里巴巴' # 靜態變數(靜態欄位) __tel = 'xxxxxxx' # 私有靜態變數(私有靜態欄位) 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
二. 類的私有成員
對於每一個類的成員而言都有兩種形式:
公有成員,在任何地方都能訪問
私有成員,只有在類的內部才能方法
私有成員和公有成員的訪問限制不同
1. 屬性
靜態屬性
物件屬性
靜態欄位(靜態屬性)
公有靜態欄位:類可以訪問;類內部可以訪問;派生類中可以訪問
私有靜態欄位:僅類內部可以訪問;
公有靜態屬性(欄位)
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() # 派生類中訪問 ==> 錯誤
2. 方法
公有方法:物件可以訪問;類內部可以訪問;派生類中可以訪問
私有方法:僅類內部可以訪問;
(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原始碼程式設計師使用的,
我們在開發中儘量不要使用雙下方法,但是深入研究雙下方法,更有益於我們閱讀原始碼。
呼叫:不同的雙下方法有不同的觸發方式,就好比盜墓時觸發的機關一樣,不知不覺就觸發了雙下方法,例如:__in