|
30鱼币
本帖最后由 King丨小义 于 2021-11-8 14:45 编辑
- class M:
- def __init__(self, x=1):
- print("hellowrold")
- self.x = x
- class A:
- m = M()
- val = 10
- # 代码运行到这个位置,程序输出一个helloworld
- a = A() # 此时实例化A对象,程序不输出helloworld
- print(a.m.x) # 1
- b = A() # 此时实例化A对象,程序不输出helloworld
- print(b.m.x) # 1
- a.m.x = 10 # 修改a.m.x
- print(b.m.x) # 奇怪的是b.m.x也改变了
- # 之后我在A中又加入了一个变量val,发现改变a.val对b.val无影响
- print("a.val = ", a.val,", b.val = ", b.val) # a.val = 10 , b.val = 10
- a.val = 520
- print("a.val = ", a.val,", b.val = ", b.val) # a.val = 520 , b.val = 10
复制代码
这个程序看起来a和b共用了一个M的实例化对象,但是没有共用val,这是为什么?
本帖最后由 hrpzcf 于 2021-11-8 15:56 编辑
首先m和val都是类属性,实例化a和b的时候,各自实例中生成了和类属性同名的实例属性,两个实例各自的实例属性m和val都指向了A类属性m和val,这时候a和b中这两个属性值都是一样的,验证一下就知道:print(a.m is b.m, a.val is b.val)。所以不论是改变a.m.x还是b.m.x,改变的都是同一个m的x属性(不是改变m),而改变a.val和b.val就不一样了,它们改变了各自实例中val的值,但互不影响(前面已经说了,实例化的时候各自生成了A类属性同名的实例属性,最后加一句就知道:print(A.val)#还是10)
|
最佳答案
查看完整内容
首先m和val都是类属性,实例化a和b的时候,各自实例中生成了和类属性同名的实例属性,两个实例各自的实例属性m和val都指向了A类属性m和val,这时候a和b中这两个属性值都是一样的,验证一下就知道:print(a.m is b.m, a.val is b.val)。所以不论是改变a.m.x还是b.m.x,改变的都是同一个m的x属性(不是改变m),而改变a.val和b.val就不一样了,它们改变了各自实例中val的值,但互不影响(前面已经说了,实例化的时候各自生成了A类属性同 ...
|