我将dict
子类化如下:
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)
现在当我有类似的东西时:
^{pr2}$这样可以很好地输出:
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
但是,如果我有一个要附加到objd
的键列表,比如使用一个默认值,它使用迭代器在列表上迭代时使用的名称创建一个键,即:
keys = ['key1', 'key2', 'key3']
for k in keys:
objd.k = None
It输出:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'k': None}
我知道我可以使用objd[k] = None
或使用setattr
方法来克服这个问题,但是我想知道为什么当我使用点表示法时,ObjectiveDict
的__setattr__
方法将迭代器作为字符串来获取?有没有一种方法可以修补我的代码,使它与点符号一起工作?在
因为Python是连贯的。在
在第一个例子中,您对
objd.d = 4
感到满意,并将其翻译为objd['d'] = 4
。但可能是:你仍然可以得到
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
(希望不是{'a': 1, 'b': 2, 'c': 3, 'e': 4}
)。在所以当你在第二种情况下写下:
^{pr2}$您只需重复
objd.k = None
,它被翻译成objd['k'] = None
,三次。在在点表示法中无法使用名称的值,只能使用名称本身。在
您可以使用以下方法使其工作:
但我真的劝你不要那样做!在第一种情况下,您将得到:
=>;输出:
{'a': 1, 'b': 2, 'c': 3, 'e': 4}
!在相关问题 更多 >
编程相关推荐