參考文獻:http://www.jb51.net/article/54286.htm
轉載、引用請附上參考文獻的鏈接。
(1)位置的區別
先看看下面這段代碼:
1 class TestClass(object): 2 val1 = 100 3 4 def __init__(self): 5 self.val2 = 200 6 7 def fcn(self,val = 400): 8 val3 = 300 9 self.val4 = val 10 self.val5 = 500 11 if __name__ == '__main__': 12 inst = TestClass() 13 14 print TestClass.val1 15 print inst.val1 16 print inst.val2 17 print inst.val3 18 print inst.val4 19 print inst.val5
這里,val1是類變量,可以由類名直接調用,也可以有對象來調用;
val2是成員變量,可以由類的對象來調用,這里可以看出成員變量一定是以self.的形式給出的,因為self的含義就是代表實例對象;
val3不是成員變量,它只是函數fcn內部的局部變量;
val4和val5也都不是成員變量,雖是以self.給出,但並沒有在構造函數中初始化。
(2)如何修改這些變量、類變量和C++中的靜態變量的區別
再看看下面的代碼(#號后面的是運行結果):
1 inst1 = TestClass() 2 inst2 = TestClass() 3 4 print TestClass.val1 # 100 5 print inst1.val1 # 100 6 7 inst1.val1 = 1000 8 print inst1.val1 # 1000 9 print TestClass.val1 # 100 10 11 TestClass.val1 =2000 12 print inst1.val1 # 1000 13 print TestClass.val1 # 2000 14 15 print inst2.val1 # 2000 16 17 inst3 = TestClass() 18 print inst3.val1 # 2000
可以發現:python的類變量和C++的靜態變量不同,並不是由類的所有對象共享。類本身擁有自己的類變量(保存在內存),當一個TestClass類的對象被構造時,會將當前類變量拷貝一份給這個對象,當前類變量的值是多少,這個對象拷貝得到的類變量的值就是多少;而且,通過對象來修改類變量,並不會影響其他對象的類變量的值,因為大家都有各自的副本,更不會影響類本身所擁有的那個類變量的值;只有類自己才能改變類本身擁有的類變量的值。