2017-03-26 94 views
0

在python中,如果我在其他方法中使用任何類方法以外的變量,並且如果我使用初始值方法與自身基本相同(或因爲它似乎)任何人都可以解釋它們之間的區別。並且適合使用任何一種方法Python中的以下代碼段聲明有什麼區別

class gaurab(): 
    value1=1 
    value2=2 
    value3=3 

values=gaurab() 

class something(): 
    def __init__(self): 
     self.value1=1 
     self.value2=100 
    def p(self): 
     print self.value1 

svalues=something() 

print values.value1 

print svalues.p() 
+0

您的縮進是錯誤的!你也想看看這裏:http://stackoverflow.com/questions/8959097/what-is-the-difference-between-class-and-instance-variables-in-python – elena

回答

0

在類中直接聲明的屬性稱爲類屬性。 和你的例子一樣(儘管縮進和一些語法是錯誤的),value1,value2和value3是類gaurab的類屬性。

在其他屬性中聲明的屬性是實例屬性,並綁定到聲明它們的類屬性。 像value1和value2變量綁定到init在類的東西。

將類屬性與在靜態類型語言中發現的靜態變量(如C++,JAVA等)進行比較。 類屬性由類的所有實例共享,因此只有這樣的屬性的一個副本被創建(例如,類的實例擁有自己的實例變量副本)。

當生成something類的實例時,會執行something__init__方法,並在其參數self中接收新實例。此方法創建兩個實例屬性:value1value2。然後這個實例被分配到實例變量中,所以它被綁定到具有這兩個實例屬性的事物上。

例如:

class foo: 
    def __init__(self): 
     self.Alist=[] #It is an instance attribute 

    Blist=[]    #It is a class attribute 

對於這個類定義,當我們創建作爲2類實例:

var1 = foo() 
var2 = foo() 

Blist屬性由兩個var1var2Alist屬性共享爲不同兩個都。所以,如果我們操作如下:

var1.Alist.append(1) 
var1.Blist.append(10) 
var2.Alist.append(2) 
var2.Blist.append(20) 

print(var1.Alist) 
print(var1.Blist) 
print(var2.Alist) 
print(var2.Blist) 

輸出將是:

[1] 
[10] 
[2] 
[10,20] 

這是因爲Blist變量同時受var1var2所以共享,變化在var1.Blist受影響var2.Blist,反之亦然。 但是,var1.Alistvar2.Alist是彼此獨立的。因此,如果你想要一個屬性對於所有類的實例是共同的,那麼你將它聲明爲類屬性(如果不是常常需要的話),你可以聲明它爲實例屬性。