1. 程式人生 > >Python 類變量與實例變量的區別和用途

Python 類變量與實例變量的區別和用途

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值會變嗎?可以看下一段代碼:

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‘ #只改變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 類變量與實例變量的區別和用途