【发布时间】:2017-09-27 08:17:41
【问题描述】:
我有一堂课:
class A:
x = 12
这两种访问形式对静态成员有什么区别?:
a = A()
print(a.x) # >> 12
print(a.__class__.x) # >> 12
【问题讨论】:
-
在这种情况下没有,但您可以通过直接分配给实例来隐藏类命名空间。
标签: python class oop static-members
我有一堂课:
class A:
x = 12
这两种访问形式对静态成员有什么区别?:
a = A()
print(a.x) # >> 12
print(a.__class__.x) # >> 12
【问题讨论】:
标签: python class oop static-members
获取值时没有区别; a.x 将退回到A.x(与a.__class__.x 相同)。
但是,如果您尝试设置一个值,a.x = 13 将设置一个新的实例变量,而将 A.x 保留为原始值。从那时起,a.x 将始终找到实例值而不是类一。
【讨论】:
没有区别,都是一样的。这与 python 如何查找它的属性有关。
它首先查看 instance 属性,如果没有找到它,它会查看 class 属性,依此类推。
在第二个语句 (a.__class__.x) 中,您明确告诉 python 直接查看类字典,跳过实例查找。
【讨论】:
这里,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
结论:如果更新类实例的值,则更改将仅限于该实例。但是,如果您更改类变量的值,如果实例没有显式覆盖该值,则更改将反映到所有实例。
【讨论】: