我子类dict
像这样在Python创建词典条目:使用点符号时,关键是一个迭代
class ObjectiveDict(dict):
def __getattr__(self, name):
if name in self:
return self[name]
else:
raise AttributeError("No such attribute: " + name)
def __setattr__(self, name, value):
"""
IMPORTANT NOTICE: when "name" is an iterator of an iterable, will not work, must use [] syntax
"""
self[name] = value
def __delattr__(self, name):
if name in self:
del self[name]
else:
raise AttributeError("No such attribute: " + name)
现在,当我有类似:
objd = ObjectiveDict({'a':1, 'b':2, 'c':3})
objd.d = 4
这种运作良好,输出:
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
但是,如果我有一列我想追加到objd
,让我们用默认值表示,它将使用我用迭代器的名称来遍历列表中的一个关键,即:
keys = ['key1', 'key2', 'key3']
for k in keys:
objd.k = None
它输出:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'k': None}
我知道我可以使用objd[k] = None
或使用setattr
方法克服此问题,但我想了解为什么当我使用点符号时,我的ObjectiveDict
的__setattr__
方法将迭代器作为字符串?有没有办法修补我的代码,所以它符合点符号?
因为'.'运算符的工作方式,属性名称作为字符串传递给'__setattr__'。在你的情况下,它会变成''''。 – 2015-02-10 10:54:54
你需要在键中使用':k setattr(objd,k,None)';这是永远不会用点符号工作。正如@AshwiniChaudhary所说,'foo.bar ='baz''被翻译为'foo .__ setattr __('bar','baz')'。 – jonrsharpe 2015-02-10 11:01:04