Python 類變量與實例變量的區別和用途
阿新 • • 發佈:2018-05-16
def IT png 不用 com img abcdefg 其他 賦值
假設有一個類Eg:
class Eg: n = ‘abcd‘ def __init__(self,name): self.name = name
兩個實例a和b:
a = Eg(‘a‘) b = Eg(‘b‘)
那麽name就是實例變量,n就是類變量。在生成實例的過程中,類變量存儲在類的內存位置中,而實例變量存儲在實例內存位置中。
此時,打印兩個實例的n值,實例會從類的內存位置去取值,所以值都為abcd:
print(a.n , b.n) >>abcd abcd
當在a的實例中修改n的賦值時,類的n值會變嗎?可以看下一段代碼:
classEg: n = ‘abcd‘ def __init__(self,name): self.name = name a = Eg(‘a‘) b = Eg(‘b‘) print(a.n,b.n) a.n = ‘efgh‘ #只改變a實例中的n print(Eg.n, a.n , b.n) >>abcd abcd >>abcd efgh abcd
可以看到只有a.n的值產生了變化,可以判斷,修改a.n的賦值只會等同於在a的內存中新增一個n變量並賦值為‘efgh’,也就是原本a.n只是映射的Eg.n,而一旦改變a.n,則由映射關系變成了自身的賦值。而沒有發生變化的b實例中,仍然會去類的內存中取值,也就是如下圖:
所以,此時如果改變類中的n值,可以想見在打印a.n和b.n時會發生什麽:
class Eg: n = ‘abcd‘ def __init__(self,name): self.name = name a = Eg(‘a‘) b = Eg(‘b‘) print(a.n,b.n) a.n = ‘efgh‘ print(Eg.n, a.n , b.n) Eg.n = ‘abcdefgh‘ #改變類中的n print(Eg.n, a.n , b.n) >>abcd abcd >>abcd efgh abcd >>abcdefgh efgh abcdefgh
類變量和實例變量的區別就是內存的位置不同,那麽這個不同帶來的作用也就顯而易見。
當需要產生很多同類實例時,如果有一個屬性是共有屬性,那麽就不用在__init__中進行實例化去占用內存,所以類變量的一大作用就是節省內存開銷。如果有某個實例的該屬性與其他實例不同時,只需要單獨對該實例的該參數進行單獨賦值即可。
Python 類變量與實例變量的區別和用途