2017-09-27 73 views
0

訪問我有一個類:的Python類的靜態成員:通過實例

class A: 
    x = 12 

是什麼靜態成員?:

a = A() 
print(a.x) # >> 12 
print(a.__class__.x) # >> 12 
+0

在這種情況下沒有,但你可以在影子類的命名空間分配直接一個實例。 –

回答

2

這兩種接入方式之間的區別是沒有區別的時候獲得價值; a.x將回退到A.x(與a.__class__.x相同)。

但是,如果您嘗試設置一個值,a.x = 13將設置一個新的實例變量,並將A.x保留爲原始值。從此,a.x總會找到實例值不是一個類。

1

沒有區別,它們是相同的。這與python 查找它的屬性有關。

它首先在實例屬性,如果沒有找到它,它看起來在屬性,等等。

在第二條語句(a.__class__.x)你明確地告訴蟒蛇直視在類字典,跳繩實例查找。

1

這裏,a.x返回類實例的變量值(範圍限於類對象),而A.x返回類變量的值。你可以驗證它想:

# create object of class A() 
>>> a = A() 
>>> b = A() 

# same value 
>>> A.x 
12 
>>> a.x 
12 

# updated a.x 
>>> a.x = 5 
>>> A.x # still old value 
12 
>>> a.x # new value 
5 
>>> b.x # old value 
12 

# updated A.x 
>>> A.x = 9 # new value 
>>> A.x 
9 
>>> a.x # old value 
5 
>>> b.x # new value 
9 

結論:如果您在更新類的實例的值,該更改將被限制在該實例。但是,如果你改變類變量的值,該變化會反映到所有的情況下,如果實例不具有明確覆蓋的值。