gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:50:02 24 4
gpt4 key购买 nike

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

对字典的赋值按预期工作,每当将项目添加到字典时打印消息。但是,当我尝试将自定义字典类型用作类的 __dict__ 属性时,属性赋值又将键/值放入我的自定义字典类中,以某种方式设法将值插入字典,同时完全绕过 __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__ 属性会产生我无法理解的行为。

>>> d = ValidatedDict(Validator)
>>> d["key"] = "value"
Validating: value
Validating: key
>>> class Foo(object): pass
...
>>> foo = Foo()
>>> foo.__dict__ = ValidatedDict(Validator)
>>> type(foo.__dict__)
<class '__main__.ValidatedDict'>
>>> foo.bar = 100 # Yields no message!
>>> foo.__dict__['odd'] = 99
Validating: 99
Validating: odd
>>> foo.__dict__
{'odd': 99, 'bar': 100}

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

最佳答案

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

关于python - 使用自定义 dict 类作为 Python 类的 __dict__ 属性的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com