如果你从dict继承,为什么__dict__总是空的?

时间:2011-08-07 15:36:37

标签: python

我对Python 2.7中的子类化行为有疑问。

如果我是内置dict类型的子类,则__ dict __似乎总是空的。 Python在哪里保存键/值对?

>>> class Foobar(dict):
...     pass
... 
>>> foobar = Foobar()
>>> foobar.__dict__
{}
>>> foobar['test'] = 1
>>> foobar.__dict__
{}
>>> 

5 个答案:

答案 0 :(得分:6)

__dict__是存储对象属性的位置。 Dicts的项目不是属性,它们是项目。大多数dicts都没有数据属性。

BTW:根据你想要实现的目标,很难正确地进行子类化dict。例如,您可以覆盖其__setitem__方法,但update将不会使用它。

答案 1 :(得分:5)

dict类纯粹在C中作为内置实现。它的数据存储对于该实现是私有的。

作为一个思想实验,想象一下如果将名称/值对放入Python dict中,那dict将如何存储它们?在另一个Python dict?然后,好吧,你明白了!

答案 2 :(得分:5)

部分答案是你误解了__dict__的目的。 __dict__用于存储属性,而不是项目,它存在于大多数用户定义的对象中。实际上,如果您以适当的方式继承dict__dict__ 包含值。

>>> class Foo(dict):
...     def __init__(self, *args, **kwargs):
...         super(Foo, self).__init__(*args, **kwargs)
...         self.banana = 'banana'
...         self['banana'] = 'not really a banana'
... 
>>> f = Foo()
>>> f.__dict__
{'banana': 'banana'}
>>> f.banana
'banana'
>>> f['banana']
'not really a banana'

答案 3 :(得分:2)

因为dict对象实际上没有__dict__所以您引用的__dict__是您的对象Foobar的本地字典。由于Foobar没有属性__dict__为空。

答案 4 :(得分:1)

__dict__用于属性:

>>> class D(dict):
    pass

>>> d=D()
>>> d.__dict__
{}
>>> d.x=5
>>> d.__dict__
{'x': 5}