我有一个继承自字典的类,以便添加一些自定义行为 - 在这种情况下,它将每个键和值传递给一个函数进行验证。在下面的示例中,“验证”只是打印一条消息。
对字典的分配按预期工作,每当项目添加到字典时打印消息。但是当我尝试使用自定义字典类型作为类的__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__
有人可以解释为什么它的行为不符合我的预期吗?它可以或不能以我正在尝试的方式工作吗?
答案 0 :(得分:5)
这是一项优化。为了支持__dict__
上的元方法,每个实例分配都需要检查元方法的存在。这是一个基本的操作 - 每个属性查找和赋值 - 所以检查这个的额外几个分支将成为整个语言的开销,对于obj.__getattr__
和obj.__setattr__
或多或少多余的东西