訪問我有一個類:的Python類的靜態成員:通過實例
class A:
x = 12
是什麼靜態成員?:
a = A()
print(a.x) # >> 12
print(a.__class__.x) # >> 12
訪問我有一個類:的Python類的靜態成員:通過實例
class A:
x = 12
是什麼靜態成員?:
a = A()
print(a.x) # >> 12
print(a.__class__.x) # >> 12
這兩種接入方式之間的區別是沒有區別的時候獲得價值; a.x
將回退到A.x
(與a.__class__.x
相同)。
但是,如果您嘗試設置一個值,a.x = 13
將設置一個新的實例變量,並將A.x
保留爲原始值。從此,a.x
總會找到實例值不是一個類。
沒有區別,它們是相同的。這與python 查找它的屬性有關。
它首先在實例屬性,如果沒有找到它,它看起來在類屬性,等等。
在第二條語句(a.__class__.x
)你明確地告訴蟒蛇直視在類字典,跳繩實例查找。
這裏,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
結論:如果您在更新類的實例的值,該更改將被限制在該實例。但是,如果你改變類變量的值,該變化會反映到所有的情況下,如果實例不具有明確覆蓋的值。
在這種情況下沒有,但你可以在影子類的命名空間分配直接一個實例。 –