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

3 投票
5 回答
1497 浏览
提问于 2025-04-16 23:04

我有个关于Python 2.7中子类行为的问题。

如果我从内置的 dict 类型创建一个子类,似乎 __ dict __ 总是空的。那么,Python把键值对存在哪里呢?

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

5 个回答

5

字典类是用C语言纯粹实现的,属于内置类型。它的数据存储方式是这个实现内部专用的。

我们可以做个假设,想象一下如果它把名字/值对放进一个Python字典里,那这个字典会怎么存储这些数据呢?是放在另一个Python字典里吗?然后,你就明白我的意思了!

6

__dict__ 是用来存放一个对象属性的地方。字典里的项目不是属性,而是一些条目。大多数字典没有数据属性。

顺便说一下,继承 dict 这个类并不容易,具体要看你想实现什么功能。例如,你可以重写它的 __setitem__ 方法,但这样的话 update 方法就不会使用你重写的版本了。

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'

撰写回答