簡體   English   中英

使用自定義dict類作為Python類的__dict__屬性的奇怪行為

[英]Odd behaviour using a custom dict class as the __dict__ attribute of Python classes

我有一個繼承自字典的類,以便添加一些自定義行為 - 在這種情況下,它將每個鍵和值傳遞給一個函數進行驗證。 在下面的示例中,“驗證”只是打印一條消息。

字典的分配按預期工作,每當項目添加到字典時打印消息。 但是當我嘗試使用自定義字典類型作為類的__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__或多或少多余的obj.__setattr__

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM