Python是dict一个对象吗?

Joh*_*wyn 12 python dictionary

dict喜欢这样的:

>>> my_dict = {u'2008': 6.57, u'2009': 4.89, u'2011': 7.74,
...            u'2010': 7.44, u'2012': 7.44}
Run Code Online (Sandbox Code Playgroud)

输出has_key:

>>> my_dict.has_key(unicode(2012))
True
Run Code Online (Sandbox Code Playgroud)

输出hasattr:

>>> hasattr(my_dict, unicode(2012))
False
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么这种行为有所不同.我用Google搜索并发现它是因为dict和对象不同.

但是,我仍然无法正确理解差异.

(顺便说一句:我使用的是python 2.7)

Mar*_*ers 27

dict实例也是对象.但他们的密钥并没有像属性一样暴露出来.

将密钥暴露为属性(也可以代替项目访问)会导致命名空间污染; 例如,你永远无法使用has_key密钥.has_key已经在字典的属性:

>>> hasattr({}, 'has_key')
True
>>> {}.has_key
<built-in method has_key of dict object at 0x7fa2a8461940>
Run Code Online (Sandbox Code Playgroud)

对象的属性和字典的内容是两个不同的东西,分离是有意的.

您始终dict可以使用__getattr__()hook方法子类化以添加属性访问:

class AttributeDict(dict):
    def __getattr__(self, name):
        if name in self:
            return self[name]
        raise AttributeError(name)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> demo = AttributeDict({'foo': 'bar'})
>>> demo.keys()
['foo']
>>> demo.foo
'bar'
Run Code Online (Sandbox Code Playgroud)

dict该类的现有属性优先:

>>> demo['has_key'] = 'monty'
>>> demo.has_key
<built-in method has_key of AttributeDict object at 0x7fa2a8464130>
Run Code Online (Sandbox Code Playgroud)

  • @moose:在周末,问答者和回答者之间的平衡似乎对回答者有点偏差.. :-) (4认同)