關於python類屬性和例項屬性的一些細節注意點
關於python類屬性和例項屬性,簡單來說,類屬性就是在定義類的時候,和類方法同一級別定義的屬性;例項屬性是在__init__例項初始化時候定義屬性。
單純從例項的角度來看, 類屬性和例項屬性都可以在例項中用self.屬性名稱的方法進行訪問更新,相對於在例項方法中的區域性屬性,可以進行例項全域性該屬性修改,很多時候甚至都混用了。
其實類屬性還可以直接用類名.類 屬性名稱方法直接訪問,即時沒有例項化。這個就是不要的類不要import,也會佔用記憶體空間,即便那個類沒有例項化。同時這個類屬性方法的記憶體空間是所有例項化物件共享的,理論上例項物件A更新了類屬性,B中這個屬性也會更新,某個方面就實現跨例項的全域性變數,可以用作例項直接互動。
這裡有一些細節點要注意的,就是如果類屬性是int,string,float,tuple這樣不可變型別,那邊其實每個例項更改的時候,就會新建一個,並不會修改原來的,這些型別的類屬性就是和例項屬性一個樣;而可變型別dict set list,還有例項物件;這些就真正全域性更新,只有一個類的例項物件修改,所有該類的例項物件都會改變。
最後還有一點,很容易忽視的,就是如果使用python Multiprocessing多執行緒處理的時候,不要嘗試用這些類屬性進行通訊,因為可能一個例項在讀,另一個已經修改了。還是用queue,這個是執行緒安全的。
下面程式碼示例說明。
class TreeNode: intItem= 5 StringItem = 'Test' listItem = [1,2,3,4] Dict = {1:2,2:4} def __init__(self, x): self.Intval = x self.listval= ['A','B'] A = TreeNode(1) B = TreeNode(2) print("TreeNode.intItem:%s, TreeNode.listItem:%s" %(TreeNode.intItem,TreeNode.listItem)) print("A:%s, B:%s" %(A.intItem, B.intItem)) print("A:%s, B:%s" %(A.StringItem, B.StringItem)) print("A:%s, B:%s" %(A.listItem, B.listItem)) print("A:%s, B:%s" %(A.Dict, B.Dict)) print("A:%s, B:%s" %(A.listval, B.listval)) A.intItem = 8 A.StringItem = 'Test2' A.listItem.insert(-1,5) A.Dict[3] = 9 A.listval.insert(-1,5) print("========only update A=========") print("TreeNode.intItem:%s, TreeNode.listItem:%s" %(TreeNode.intItem,TreeNode.listItem)) print("A:%s, B:%s" %(A.intItem, B.intItem)) print("A:%s, B:%s" %(A.StringItem, B.StringItem)) print("A:%s, B:%s" %(A.listItem, B.listItem)) print("A:%s, B:%s" %(A.Dict, B.Dict)) print("A:%s, B:%s" %(A.listval, B.listval))
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2679071/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python 類的屬性與例項屬性Python
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- Python類屬性和例項屬性分別是什麼?Python
- Python - 物件導向程式設計 - 類變數、例項變數/類屬性、例項屬性Python物件程式設計變數
- 零基礎學習 Python 之細說類屬性 & 例項Python
- 理解Python中的類物件、例項物件、屬性、方法Python物件
- 深入理解JavaScript類與物件:揭秘類欄位和靜態屬性的妙用,js靜態屬性和例項屬性JavaScript物件JS
- vue例項的屬性和方法Vue
- JavaScript 例項屬性JavaScript
- 關於input 中 hidden屬性在後臺作用的例項
- Python例項屬性的優先順序分析Python
- Python列印類的屬性Python
- vue元件使用的細節 is 屬性Vue元件
- Spring(三)屬性配置細節Spring
- checkbox name屬性值注意點
- python例項屬性的顯示方法-dir、__dict__Python
- vue例項中watch屬性的使用Vue
- SuperObject Delphi 的 JSON 屬性亂序 – 操作類改造 – 關於屬性順序的問題ObjectJSON
- defer 屬性和 async 屬性
- 關於IOS 屬性atomic(原子性)的理解iOS
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- [轉載] python複數型別-Python 複數屬性和方法操作例項Python型別
- 類的靜態屬性和方法
- 說說如何使用 Python 類的屬性Python
- Python __dict__屬性:檢視物件內部所有屬性名和屬性值組成的字典Python物件
- python物件屬性管理(2):property管理屬性Python物件
- 關於UINavigationBar和UITabBar的translucent屬性的問題UINavigationtabBar
- Python中的屬性Python
- Zookeeper(2)---節點屬性、監聽和許可權
- python中類物件及類屬性的介紹Python物件
- Python函式屬性和PyCodeObjectPython函式Object
- 描述符:例項屬性遮蓋方法的原因
- Python - 物件導向程式設計 - 公共屬性、保護屬性、私有屬性Python物件程式設計
- 關於JS陣列中相同物件屬性值歸類方法的一點思考JS陣列物件
- 揭秘Java反射:如何輕鬆獲取類的屬性及父類屬性Java反射
- vue計算屬性和vue實力的屬性和方法Vue
- CMake 屬性之全域性屬性
- 一些常用的模型屬性模型