Python静态类成员:通过实例访问

时间:2017-09-27 08:17:42

标签: python class oop static-members

我有一个班级:

class A:
  x = 12

这两种访问表单与静态成员有什么区别?:

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

3 个答案:

答案 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

结论:如果更新类实例的值,则更改将仅限于该实例。但是,如果更改类变量的值,则如果实例未明确覆盖该值,则更改将反映到所有实例。