首页 新闻 会员 周边 捐助

Python 类的组合产生的问题

0
悬赏园豆:100 [已解决问题] 解决于 2019-05-26 18:24

问题:类属性定义了另一个类的对象时,为什么会产生全局改变的效果?

举例:


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

#倒这我就想不通了,为什么类属性并没有变,我另一个对象根本没有赋值会被改变值呢




#希望各位指点
#感谢任何形式的回答
Poceer的主页 Poceer | 初学一级 | 园豆:112
提问于:2019-05-25 15:05
< >
分享
最佳答案
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!

收获园豆:100
Harp_Yestar | 菜鸟二级 |园豆:325 | 2019-05-26 17:10

我都没注意到我这描述错的..不过你能理解我的意思真是太好了,解答的非常易懂,十分感谢

Poceer | 园豆:112 (初学一级) | 2019-05-26 18:23
其他回答(1)
0

恕我没有看懂你的问题,不过一般定义类没有你这样写的,都是这样:

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

推荐看下廖雪峰的教程,上面的写法还可以简化。

会长 | 园豆:12463 (专家六级) | 2019-05-25 17:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册