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)