问题引入:
class A: x = 1class B: t = A()b1 = B()b2 = B()b1.t.x = 2print(b2.t.x) >>> 2
为什么操作对象b1 会改变另一个对象 b2 的属性值?对象之间的属性应该相互独立?难道类的对象属性和列表一样是一种可变属性,操作对象属性会改变类属性,从而改变了另一个该类实例中的属性?
print(A.x) >>> 1
发现类属性并没有被改变
查阅多方资料后,发现这种情况和实例的创建规则有关
class A: x=1a=A()print(id(a.x))print(id(A.x))A.x=2print(id(a.x))print(id(A.x))a.x=4print(id(a.x))print(id(A.x))>>>140722909176464 #显然开始实例属性会指向类属性,他们是同一个地址>>>140722909176464>>>140722909176496 #改变了类属性,实例属性会跟着转变指向新的地址>>>140722909176496>>>140722909176560 #但是改变了实例的属性,对象创建了自己的x,看到地址改变了 >>>140722909176496 #而类属性并不受影响
但是
def out(): print("我被创建了") class A: x = 1 def __init__(self): out() class B: t=A()
>>> “我被创建了” #对象作为属性时,在定义时就被创建处一个A对象,后续不会再次创建 #这就是它与普通属性的本质区别了。
s1 = B() s1.t.x = 2 #改变了对象的属性,理应创建自己的t print(id(B.t)) print(id(s1.t))
>>>1730846532384 #但是和上面的普通属性不同,这里s1没有创建一个新的A类实例,而是用了同一个对象t,所以后来再创建s2也是沿用t,自然看到x被改变了 >>>1730846532384 #打印出A类的x,发现并没有被改变,这也证明了它们并没有改变A的类属性。而是用的都是同一个A的实例t