Python 類中的"靜態"成員變量

本文環境:Python 2.7 app

 

一個類的三個對象實例的屬性被同時修改函數

有段代碼以下:this

class task_queue:
    queue=[]
    
    def append(self,obj):
        self.queue.append(obj)
        
    def print_queue(self):
        print self.queue
        

if __name__=="__main__":
    a=task_queue()
    b=task_queue()
    c=task_queue()
    
    a.append('tc_1')
    
    a.print_queue()
    b.print_queue()
    c.print_queue()

咱們指望在隊列 a 中插入 tc_1,結果 b 和 c 也被同時操做了,這並非咱們所指望的spa

['tc_1']
['tc_1']
['tc_1']

static

這種行爲很像靜態變量的行爲,但是 Python 中並無 static 關鍵字,這是怎麼回事?code

Java 和 C++ 中的 static 關鍵字有多種用法對象

其中,若是 static 去修飾一個類的屬性,那麼該屬性就不是被各個對象所持有,而是一片公共的區域blog

利用這種方法,咱們能夠在構造函數中對一個靜態變量 ++ 以查看它被實例化了多少次隊列

class a(){
    static private count  
    public a(){
        this.count++
    }
    public static instance_count(){
        System.out.println(this.count)
    }
}

回到 Python

Python 中並無訪問限定符 static,這種機制在 Python 中被稱爲 類的屬性 和 對象的屬性it

第一段代碼中的 queue 在類的聲明中被初始化爲空,這是 類的屬性class

a.append() 以後,queue 中添加了 'tc_1',而 b 和 c 獲取的 queue 依然是公共的 類的屬性

如何讓這個屬性變爲對象本身的呢?改動以下:

class task_queue:
    
    def __init__(self):
        self.queue=[]
    
    def append(self,obj):
        self.queue.append(obj)
        
    def print_queue(self):
        print self.queue

在構造對象實例時構造對象本身的屬性 queue

['tc_1']
[]
[]

另外一個例子

class a():  
    num = 0  

if __name__=="__main__":
    
    obj1 = a()  
    obj2 = a()   
    print obj1.num, obj2.num, a.num   
          
    obj1.num += 1  
    print obj1.num, obj2.num, a.num     
      
    a.num += 2  
    print obj1.num, obj2.num, a.num   

實例化 obj1 和 obj2 的時候,他們都沒有對屬性 num 進行操做,因此打印出來的都是類 a 的屬性 num,也就是 0

後來 obj1 對本身的 num 進行 +1 以後,與類的屬性脫離了關係,屬性 num 就變成對象 obj1 本身的屬性,而 obj2 嘗試打印屬性 num 的時候仍是從類的屬性中去讀取

第三段中,類的屬性 +2 後,obj1.num 沒有受到影響,而 obj2 嘗試讀取 num 屬性時,依舊從類中去拿,因此它拿到的 num 是2

0 0 0
1 0 0
1 2 2
相關文章
相關標籤/搜索