我对Python 2.7中的子类化行为有疑问。
如果我是内置dict
类型的子类,则__ dict __
似乎总是空的。
Python在哪里保存键/值对?
>>> class Foobar(dict):
... pass
...
>>> foobar = Foobar()
>>> foobar.__dict__
{}
>>> foobar['test'] = 1
>>> foobar.__dict__
{}
>>>
答案 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}