问题:类属性定义了另一个类的对象时,为什么会产生全局改变的效果?
举例:
class A:
t = 1
s1 = A()
s2 = A()
s1.t = 2
print(s2.t)
>>> 1
#这样显然是一个对象改变了它的属性,但是不会对其他对象产生影响
但是我也知道有一些例外
class A:
L = []
s1 = A()
s2 = A()
s1.L.append(1)
print(s2.L)
>>>1
# 当类属性是一个列表时,对象改变属性会产生全局效果
接下来是我的问题:
class A:
x = 1
class B:
t = A() #类的组合,类属性是另一个类的对象
s1 = B()
s2 = B()
s1.t.x = 2
print(s2.t.x)
>>>2
#类的组合情况下,一个对象改变属性,也产生了全局的效果,另一个对象的属性也被改变
#我开始觉得,这和list是一种情况,操作可变对象改变了类属性,自然由这个类创建的实例的属性也全被改变了
#但是我打印了A.x 发现,类属性并没有变,还是1
#倒这我就想不通了,为什么类属性并没有变,我另一个对象根本没有赋值会被改变值呢
#希望各位指点
#感谢任何形式的回答
首先你前面结果就错误了!由图例证:below:
1.首先为什么这样:这个设计到一个可变类型和不可变类型,数字类型为不可变类型,列表为可变类型。
2.其次,对于作者的问题是关于第三个嵌套类实例化。
解答如下:
(1)首先对于
s1 = B() #我打印了下实例的内存 ==> <main.B object at 0x0000015AFE905F98>
s2 = B() # <main.B object at 0x0000015AFE898320>
很明显,二者实例的内存地址是不用的,两个不用的对象!!
(2)然后我们再来看下s1.t和s2.t的内存地址
s1.t
<main.A object at 0x0000015AFE8865F8>
s2.t
<main.A object at 0x0000015AFE8865F8>
很明显二者t出来的A类实例属于同一个对象,然后对于不可变类型x的赋值,即x=2,因此t出来的对象为同一个,所以两者的最后x出来的值 == 2.
因为在B类型建立之初,t = A(), 这一步就已经对A进行了实例化,创建了一个对象,所以后面t出来的是同一个对象。
Over!
我都没注意到我这描述错的..不过你能理解我的意思真是太好了,解答的非常易懂,十分感谢
恕我没有看懂你的问题,不过一般定义类没有你这样写的,都是这样:
class A(object):
def __init__(self, name, age):
self._name = age
self._age = age
def get_name(self):
return self._name
def set_name(self, name):
self._name = name
推荐看下廖雪峰的教程,上面的写法还可以简化。