假设我有以下课程:
class A:
arr = []
如果我附加到arr
举个例子A
,所有实例A
已更新。
>>> a1, a2 = A(), A()
>>> a1.arr.append(0)
>>> a1.arr
[0]
>>> a2.arr
[0]
>>> A.arr
[0]
但是,如果我设置arr
为实例的数组文字A
,其他情况是not更新:
>>> a1.arr = [1,2,3]
>>> a1.arr
[1, 2, 3]
>>> a2.arr
[0]
>>> A.arr
[0]
为什么会出现这种情况?当class属性是一个列表时,为什么之间的结果不同append
and =
?
当类属性不是数组时,我还注意到类似的行为:
class B:
value = ''
>>> b1, b2 = B(), B()
>>> b1.value = 'hello'
>>> b1.value
'hello'
>>> b2.value
''
>>> B.value
''
>>> B.value = 'goodbye'
>>> b1.value
'hello'
>>> b2.value
'goodbye'
>>> B.value
'goodbye'
当类属性是字符串时,为什么行为看起来不同?什么时候b1
的值已经设置了,为什么B.value = ...
只更新b2
的值而不是b1
's?
您对类属性和实例属性的处理感到困惑。实例属性将default到类属性。但是,当您专门更改实例时,您会创建一个实例属性。让我们来看看 B 类的序列:
class B:
value = ''
# You have a single attribute, `B.value`
b1, b2 = B(), B()
b1.value = 'hello'
# This shadows b1's reference to B.value,
# inserting a local reference to its own attribute of the same name.
# You can check this with the id() function
b2.value # this still refers to the class attribute.
从这里看清楚了吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)