標籤:com 記憶體 意義 裝飾器 儲存方式 賦值 直接 河北省 位置
一、類的成員
類的成員可以分為三大類:欄位、方法、屬性
註:所有成員中,只有普通欄位的內容儲存對象中,即:根據此類建立了多少對象,在記憶體中就有多少個普通欄位。而其他的成員,則都是儲存在類中,即:無論對象的多少,在記憶體中只建立一份。
一、欄位
欄位包括:普通欄位和靜態欄位,他們在定義和使用中有所區別,而最本質的區別是記憶體中儲存的位置不同。
普通欄位屬於對象,靜態欄位屬於類
class Province: # 靜態欄位 country = ‘中國‘ def __init__(self, name): # 普通欄位 self.name = name# 直接存取普通欄位obj = Province(‘河北省‘)print obj.name# 直接存取靜態欄位Province.country
由上述代碼可以看出,普通欄位需要通過對象來訪問,靜態欄位通過類訪問,在使用上可以看出普通欄位和靜態欄位的歸屬是不同的。其在內容的儲存方式類似如:
由可知:
- 靜態欄位在記憶體中只儲存一份,在對象中,有一個類對象指標指向類中的靜態欄位
- 普通欄位在每個對象中都要儲存一份
應用情境: 通過類建立對象時,如果每個對象都具有相同的欄位,那麼就使用靜態欄位。
二、方法
方法包括:普通方法、靜態方法和類方法,三種方法在記憶體中都歸屬於類,區別在於調用方式不同。
- 普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self;
- 類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類複製給cls;
- 靜態方法:由類調用;無預設參數;
class Foo: def __init__(self, name): self.name = name def ord_func(self): """ 定義普通方法,至少有一個self參數 """ # print self.name print ‘普通方法‘ @classmethod def class_func(cls): """ 定義類方法,至少有一個cls參數 """ print ‘類方法‘ @staticmethod def static_func(): """ 定義靜態方法 ,無預設參數""" print ‘靜態方法‘# 調用普通方法f = Foo()f.ord_func()# 調用類方法Foo.class_func()# 調用靜態方法Foo.static_func()
相同點:對於所有的方法而言,均屬於類(非對象)中,所以,在記憶體中也只儲存一份。
不同點:方法調用者不同、調用方法時自動傳入的參數不同。
三、屬性
如果你已經瞭解Python類中的方法,那麼屬性就非常簡單了,因為Python中的屬性其實是普通方法的變種。
對於屬性,有以下三個知識點:
1)屬性的基本使用
# ############### 定義 ###############class Foo: def func(self): pass # 定義屬性 @property def prop(self): pass# ############### 調用 ###############foo_obj = Foo()foo_obj.func()foo_obj.prop #調用屬性
由屬性的定義和調用要注意一下幾點:
- 定義時,在普通方法的基礎上添加 @property 裝飾器;
- 定義時,屬性僅有一個self參數
- 調用時,無需括弧
方法:foo_obj.func()
屬性:foo_obj.prop
注意:屬性存在意義是:訪問屬性時可以製造出和訪問欄位完全相同的假象
屬性由方法變種而來,如果Python中沒有屬性,方法完全可以代替其功能。
Python知識回顧 —— 物件導向