你可以使用collections模块中的ABC(抽象基类)轻松编写一个行为类似于dict的对象。它甚至会告诉你是否错过了一种方法,因此以下是关闭ABC的最低版本。
import collectionsclass TransformedDict(collections.MutableMapping): """A dictionary that applies an arbitrary key-altering function before accessing the keys""" def __init__(self, *args, **kwargs): self.store = dict() self.update(dict(*args, **kwargs)) # use the free update to set keys def __getitem__(self, key): return self.store[self.__keytransform__(key)] def __setitem__(self, key, value): self.store[self.__keytransform__(key)] = value def __delitem__(self, key): del self.store[self.__keytransform__(key)] def __iter__(self): return iter(self.store) def __len__(self): return len(self.store) def __keytransform__(self, key): return key
你可以从ABC获得一些免费方法:
class MyTransformedDict(TransformedDict): def __keytransform__(self, key): return key.lower()s = MyTransformedDict([('Test', 'test')])assert s.get('TEST') is s['test'] # free getassert 'TeSt' in s # free __contains__ # free setdefault, __eq__, and so onimport pickleassert pickle.loads(pickle.dumps(s)) == s # works too since we just use a normal dict
我不会
dict直接继承(或其他内置)。这通常没有任何意义,因为你实际要做的是实现dict的接口。而这正是ABC的目的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)