不要使用UserDict
類 - 你不需要它。正如文檔所說,你可以直接繼承dict
。
但是,你仍然希望UserDict
模塊,爲DictMixin
:
注:DictMixin
,雖然沒有正式棄用,已經在Python 3中刪除,並且它在你使用collections.MutableMapping
的文檔建議。但是,這有一個缺點 - 需要實現更多的字典界面 - __delitem__
,__getitem__
,__iter__
,__len__
和__setitem__
。使用DictMixin
,你可以實現你想改變的那個,其餘的使用默認實現。
from UserDict import DictMixin
class MyDict(DictMixin, dict):
def __setitem__(self, key, value):
print key, value # just an example
# use intern(key) or whatever here
dict.__setitem__(self, key, value) # or
# super(MyDict, self).__setitem__(key, value)
m = MyDict()
m['a'] = 'b'
# a b
m.update({'a': 'c'})
# a c
它會自動讓update
使用__setitem__
你想要的。
來源
2011-08-22 13:50:54
agf
但是至少有一些ABCs對於簡化不是基於內置類型的實現也很有用,正如同一部分的這段代碼所示:'幾個ABCs也可用作mixin,使它更容易開發支持容器API的類。例如,要編寫支持完整設置API的類,只需提供三種底層抽象方法:__contains __(),__iter __()和__len __()。 ABC提供剩餘的方法,如__和__()和isdisjoint()' – delnan
如果你想測試是否是'dict',使用'isistance(x,dict)'。如果你想測試它是某種映射,使用'isinstance(x,映射)'。這是ABCs的用途。它們僅在每種映射使用'Mapping.register()'或直接對其進行子類化時纔有用。是的,這**是** ABC的主要目的。 –