1. 程式人生 > >Python面向物件 | 類的成員

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