使用自定义dict类作为Python类的__dict__属性的奇怪行为

时间:2011-03-03 16:08:57

标签: python attributes metaprogramming magic-methods

我有一个继承自字典的类,以便添加一些自定义行为 - 在这种情况下,它将每个键和值传递给一个函数进行验证。在下面的示例中,“验证”只是打印一条消息。

对字典的分配按预期工作,每当项目添加到字典时打印消息。但是当我尝试使用自定义字典类型作为类的__dict__属性时,属性赋值又将键/值放入我的自定义字典类中,以某种方式设法将值插入字典中,同时完全绕过{ {1}}(以及我定义的可能添加键的其他方法)。

自定义词典:

__setitem__

将它用作类的from collections import MutableMapping class ValidatedDict(dict): """A dictionary that passes each value it ends up storing through a given validator function. """ def __init__(self, validator, *args, **kwargs): self.__validator = validator self.update(*args, **kwargs) def __setitem__(self, key, value): self.__validator(value) self.__validator(key) dict.__setitem__(self, key, value) def copy(self): pass # snipped def fromkeys(validator, seq, v = None): pass # snipped setdefault = MutableMapping.setdefault update = MutableMapping.update def Validator(i): print "Validating:", i 属性会产生我不理解的行为。

__dict__

有人可以解释为什么它的行为不符合我的预期吗?它可以或不能以我正在尝试的方式工作吗?

1 个答案:

答案 0 :(得分:5)

这是一项优化。为了支持__dict__上的元方法,每个实例分配都需要检查元方法的存在。这是一个基本的操作 - 每个属性查找和赋值 - 所以检查这个的额外几个分支将成为整个语言的开销,对于obj.__getattr__obj.__setattr__或多或少多余的东西