我有一个班级:
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 :(得分:1)
没有区别,它们是一样的。这与python 查找它的属性的方式有关。
首先查看实例属性,如果它没有找到它,则会在类属性中查找,依此类推。
在第二个语句(a.__class__.x
)中,您明确告诉python直接查看类dict,跳过实例查找。
答案 2 :(得分: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
结论:如果更新类实例的值,则更改将仅限于该实例。但是,如果更改类变量的值,则如果实例未明确覆盖该值,则更改将反映到所有实例。