博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python类的组合时产生的属性同步改变问题
阅读量:5096 次
发布时间:2019-06-13

本文共 1048 字,大约阅读时间需要 3 分钟。

问题引入:

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

 

转载于:https://www.cnblogs.com/Poceer/p/10927106.html

你可能感兴趣的文章
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
使用word发布博客
查看>>
面向对象的小demo
查看>>
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
Hmailserver搭建邮件服务器
查看>>
django之多表查询-2
查看>>
快速幂
查看>>
改善C#公共程序类库质量的10种方法
查看>>
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>