一、類變量
在類命名空間內定義的變量就屬於類變量,python允許使用類來修改、讀取類變量。
例:
class a: b = '我是類變量' def c(self): print (a.b) # 通過類訪問類變量b print (a.b) # 通過類訪問類變量,打印 我是類變量 A = a() A.c() # 打印 我是類變量 a.b = '我被修改了' # 修改類變量 A.c() # 打印 我被修改了
其實,Python也可以使用對象來訪問所屬類的變量,實際上通過對象訪問類變量,本質還是通過類名訪問類變量,例:
class a: b = '我是類變量' def c(self): print (self.b) # self訪問a類的類變量,self代表c方法的調用者a對象 A = a() print (A.b) # 通過對象訪問類變量b,打印 我是類變量 A.c() # 打印 我是類變量 A.b = '我又被修改了' # 通過對象修改類變量 A.c() # 如果通過對象對類變量進行修改,那么訪問這些對象的類變量也會讀到修改后的值 打印 我又被修改了 print (A.b) # 打印 我又被修改了 print (a.b) # 通過類訪問類變量,可以看出程序對對象的類變量修改了值,只會在該對象中生效,打印 我是類變量
二、實例變量
先看一段代碼:
class a: b = '我是類變量' def c(self,b): self.b = b print (self.b) A = a() A.c('我是實例變量') # 打印 我是實例變量 print (A.b) # 打印 我是實例變量 print (a.b) # 打印 我是類變量 a.b = '我怎么又被修改了!' # 通過類修改類變量 A.c('我仍然是實例變量!') # 不會對實例變量造成任何影響,打印 我仍然是實例變量!
在上面代碼中,
1、self.b = b 看上去像是對類變量進行賦值,但實際上是重新定義了兩個實例變量,print (A.b)由於在調用a對象的c()方法之后,該對象本身已經有b這個實例變量,程序會輸出實例變量;
2、print (a.b)通過a來訪問他的b變量,此時才是在訪問類變量;
3、最后兩段代碼,即使程序通過類修改類變量,也不會對實例變量造成任何影響。
同樣,對一個對象的實例進行修改,也不會影響到類變量和其他對象的實例變量,例:
class a: b = '我是類變量' def c(self): self.b = '我是實例變量' print (self.b) A = a() B = a() A.c() # 打印 我是實例變量 B.c() # 打印 我是實例變量 A.b = '我是實例變量,我被修改了' print (A.b) # 只是對這個對象的實例變量b進行了修改,打印 我是實例變量,我被修改了 print (B.b) # 不會影響到其他對象的實例變量,打印 我是實例變量 print (a.b) # 也不會對類變量有影響,打印 我是類變量