如果从dict继承,为什么__dict__总是空的?
我有个关于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'