我有一個類從字典繼承,以添加一些自定義行爲 - 在這種情況下,它將每個鍵和值傳遞給函數進行驗證。在下面的例子中,'驗證'只是打印一條消息。奇怪的行爲使用自定義的類類作爲Python類的__dict__屬性
字典的賦值按預期工作,只要將項添加到字典中就打印消息。但是,當我嘗試使用自定義詞典類型作爲類的__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__',除了'__new__' - 如果你真的必須的話。你想在這裏做什麼應該用自定義的'__setattribute__'方法來完成。 –
說實話,我並不是真的「想做點什麼」。我正在寫驗證的字典類,只是爲了好玩,想把它作爲'__dict__'實例來嘗試。我的問題的原因是我真的很想理解它爲什麼會這樣,以及是否可以繞過它(以及如何)。 – porgarmingduod