类属性和实例属性

原文

python是动态加载属性的。

python会优先查找实例属性,然后在查找类属性。

class A(object):
    a = 1

o1 = A()
o2 = A()

# (1)
print(o1.a, o2.a, A.a)
# (1, 1, 1)

# (2)
o1.a = 2
print(o1.a, o2.a, A.a)
# (2, 1, 1)

# (3)
A.a = 3
print(o1.a, o2.a, A.a)
# (2, 3, 3)

(1):此时o1和o2是都没有实例属性的,所以继续向上查找类属性得到a = 1

(2):对o1.a赋值,此时才会给o1一个实例属性

print(o1.__dict__, o2.__dict__)
# ({'a': 2}, {})

(3):因为o1先找到了实例属性,所以不会改变a的值