从扩展类更新dict attrib将更新基类。为什么?

2024-06-11 14:46:49 发布

您现在位置:Python中文网/ 问答频道 /正文

>>> class Test(object):
...   test = {}
... 
>>> class Test2(Test):
...   pass
... 
>>> Test2.test.update({1:2})
>>> Test.test
{1: 2}
>>> 

我在等{}。旧式类也会发生这种情况。你知道吗


Tags: testobject情况updatepassclasstest2旧式
3条回答
Test2.test.update({1:2})

这将更新Test2继承的基类Test属性。你知道吗

如果你想让他们每个人都有自己的口述,那么:

>>> class Test(object):
...     test = {}
... 
>>> class Test2(Test):
...     test = {}
... 
>>> Test2.test.update({1:2})
>>> Test.test
{}
>>> 

Python有一个我非常喜欢的特性:数据继承,这是您刚刚在实际操作中看到的。你知道吗

您需要使用2个下划线来激活类/属性mung

>>> class Test(object):
...     __test = {}
...
>>> class Test2(Test):
...     pass
...
>>> Test2.__test.update({1:2})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Test2' has no attribute '__test'

由于属性munging,可以在Test2._Test__test找到该属性

如果希望所有子类都自动获得它们自己的__test属性,那么可以为Test使用元类

update的工作方式并不奇怪。关键是testclass attribute,类属性在类之间共享(直到有人将test重新绑定到其他对象)。你知道吗

看看这个IDE会话:

>>> class Test(object):
...     test = {}
... 
>>> class Test2(Test):
...     pass
... 
>>> id(Test.test)
32424144
>>> id(Test2.test)
32424144
>>> Test.test.update({1:2})
>>> Test2.test
{1: 2}
>>> Test2.test = {}
>>> id(Test2.test)
32424480
>>> Test.test
{1: 2}
>>> Test2.test
{}
>>> del Test2.test
>>> Test2.test
{1: 2}

有关类属性如何工作的更多信息,请查看类下的Data Model Reference。你知道吗

相关问题 更多 >